スレッドの制御について – 固定ページ 2 – プログラミング – Home

スレッドの制御について
 
通知
すべてクリア

[解決済] スレッドの制御について

固定ページ 2 / 2

初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

>tetrapod さん
全くその通りで返す言葉もありません。

>WaitFor*Object* を使ってよい場所と
>MsgWaitForMultipleObjects* でなければならない場所と
>存在する。そこで単純に WaitFor してよいかどうかを検証してあるかい?
># そーいう話まで理解しようとするなら一日程度ではすまないぜ
まだそんなところまでは理解が出来ていません。すみません。
これから順序だててやっていこうと思っています。

>あと既に指摘があるけど CreateThread ではダメな場合がある
>beginthread/ex や AfxBeginThread に直さなければ動かない可能性がある
こちらも beginthread/ex や AfxBeginThread やってみます。

>worker スレッド作って、そして UI スレッドがそれを WaitFor する
>ってのは原理的に無意味なので、たとえテスト目的でも違う方式取るべきだな
通常はワークスレッドを待たせてメインのスレッドを動かすというのが
通常の動作ということスレッドの使い方という理解で正しいでしょうか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>こちらも beginthread/ex や AfxBeginThread やってみます。
開発環境はVCですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

その言語の標準ライブラリに同様の関数がある場合はそちらを使った方が良いです。
スレッド毎に標準ライブラリの初期化が必要だったりするのでWin32APIを直に使うと
必要な処理がされなかったりします。標準ライブラリを使わずにすべてWin32APIと
自前のコードでやると言うなら話は別になりますが。

あと、MFCを使っているかどうかによっても使う関数が代わります。
MFCをつかっているのであれば、AfxBeginThreadを使います。
この関数はMFCの初期化処理をするようになっていたはずです。

で、開発環境に関しても明示してください。
それによって話が変わる事があります。
あと、MFCの使用の有無も。


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

>ITO さん
はい。そうです。

いろいろやってみた所、どうもC言語(VC2005)の環境では問題なく、
C++(VC2005)で正しく動作しないようです。

C++の環境で動作しなかったため、環境の問題ではなく、
自分の書き方の問題だと思い込んでいました。

どうも、C++の環境ではマルチスレッド化できていない?
もしくは、m_stop = false が反映されていないようです。

ですので、下記のテストもC++では無理でした。
  if(m_stop == true) // WaitForSingleObjectから変更
Sleep(100);    // 

ただ、C++の環境でも、 WRITE()は呼ばれてはいます。
他から WRITE()を呼び出すことはありません。

Thread作成APIでエラーが返ってくるようなこともありません。
AfxBeginThreadでも試しましたが、結果は同じでした。

CもC++も内容はほぼ一緒です。

また他の調査をやってみます。


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

>PATIOさん

C  VC2005 WIN32API使用、MFC未使用
C++ VC2005 WIN32API使用、MFC使用

となっています。

>その言語の標準ライブラリに同様の関数がある場合はそちらを使った方が良いです。
>スレッド毎に標準ライブラリの初期化が必要だったりするのでWin32APIを直に使うと
>必要な処理がされなかったりします。標準ライブラリを使わずにすべてWin32APIと
>自前のコードでやると言うなら話は別になりますが。
そうなのですか。知りませんでした。勉強になります。。


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

C++ VC2005 WIN32API使用、MFC使用
m_stopが別の変数だったりしませんか?

ちょっと試してみました。
int g_stop ; // グローバルにしました
void WRITE();
m_flg はメンバ変数

void CxxxDlg::OnOK()
{
if(m_flg == 0) {
m_flg = 1;
g_stop = false;
m_hThead = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WRITE,
(LPVOID)NULL,0,NULL);
} else {
g_stop = true;
m_flg = 0;
::WaitForSingleObject(m_hThead, INFINITE);
TRACE(end\n);
}

}

void WRITE()
{
while(!g_stop) {
Sleep(1);
}
TRACE(スレッドを終了します。\n);
}

Sleepを20000とかにすると
2008/03/28(金) 11:04:12でtetrapodさんが最後に
書いている意味が分かると思います。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> m_stopにvolatile修飾付いているのでしょうか?
について確認した?


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

返事が遅くなりすみません。

と さん
ありがとうございます。
友人のVCの環境に同じソースを思っていきやってみたところ
なんとうまくいきました!

理由はわかりませんが、友人にソースを確認してもらい
特におかしいところはないということです。

そのあとVCとサービスパック??で入れ直したところ
正常に動作しました。理由はいまだにわかりません。。。

>Sleepを20000とかにすると
>2008/03/28(金) 11:04:12でtetrapodさんが最後に
>書いている意味が分かると思います。
これもよくわかりました。
本スレッドを止めてというのはやはりサンプルでもよくないですね。
別のをまた作って試してみます。

gak さん
すみません!見逃してました。
volatile修飾付はついてつけていません。
というか、volatileについてまだよくわかりませんが調べてみます。

多くの方に回答いただきありがとうございました。
勉強になりました。

もっと勉強していきたいと思います。
501vosk3aslb4


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました