>tetrapod さん
全くその通りで返す言葉もありません。
>WaitFor*Object* を使ってよい場所と
>MsgWaitForMultipleObjects* でなければならない場所と
>存在する。そこで単純に WaitFor してよいかどうかを検証してあるかい?
># そーいう話まで理解しようとするなら一日程度ではすまないぜ
まだそんなところまでは理解が出来ていません。すみません。
これから順序だててやっていこうと思っています。
>あと既に指摘があるけど CreateThread ではダメな場合がある
>beginthread/ex や AfxBeginThread に直さなければ動かない可能性がある
こちらも beginthread/ex や AfxBeginThread やってみます。
>worker スレッド作って、そして UI スレッドがそれを WaitFor する
>ってのは原理的に無意味なので、たとえテスト目的でも違う方式取るべきだな
通常はワークスレッドを待たせてメインのスレッドを動かすというのが
通常の動作ということスレッドの使い方という理解で正しいでしょうか?
>こちらも beginthread/ex や AfxBeginThread やってみます。
開発環境はVCですか?
その言語の標準ライブラリに同様の関数がある場合はそちらを使った方が良いです。
スレッド毎に標準ライブラリの初期化が必要だったりするのでWin32APIを直に使うと
必要な処理がされなかったりします。標準ライブラリを使わずにすべてWin32APIと
自前のコードでやると言うなら話は別になりますが。
あと、MFCを使っているかどうかによっても使う関数が代わります。
MFCをつかっているのであれば、AfxBeginThreadを使います。
この関数はMFCの初期化処理をするようになっていたはずです。
で、開発環境に関しても明示してください。
それによって話が変わる事があります。
あと、MFCの使用の有無も。
>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++も内容はほぼ一緒です。
また他の調査をやってみます。
>PATIOさん
C VC2005 WIN32API使用、MFC未使用
C++ VC2005 WIN32API使用、MFC使用
となっています。
>その言語の標準ライブラリに同様の関数がある場合はそちらを使った方が良いです。
>スレッド毎に標準ライブラリの初期化が必要だったりするのでWin32APIを直に使うと
>必要な処理がされなかったりします。標準ライブラリを使わずにすべてWin32APIと
>自前のコードでやると言うなら話は別になりますが。
そうなのですか。知りませんでした。勉強になります。。
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さんが最後に
書いている意味が分かると思います。
> m_stopにvolatile修飾付いているのでしょうか?
について確認した?
返事が遅くなりすみません。
と さん
ありがとうございます。
友人のVCの環境に同じソースを思っていきやってみたところ
なんとうまくいきました!
理由はわかりませんが、友人にソースを確認してもらい
特におかしいところはないということです。
そのあとVCとサービスパック??で入れ直したところ
正常に動作しました。理由はいまだにわかりません。。。
>Sleepを20000とかにすると
>2008/03/28(金) 11:04:12でtetrapodさんが最後に
>書いている意味が分かると思います。
これもよくわかりました。
本スレッドを止めてというのはやはりサンプルでもよくないですね。
別のをまた作って試してみます。
gak さん
すみません!見逃してました。
volatile修飾付はついてつけていません。
というか、volatileについてまだよくわかりませんが調べてみます。
多くの方に回答いただきありがとうございました。
勉強になりました。
もっと勉強していきたいと思います。
501vosk3aslb4