質問 |
||
| 質問者:delsole_ | スレッドについて | |
|---|---|---|
困り度:
|
スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) { File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") } |
|
質問投稿日時:08/03/27 17:00 質問番号:3899595 |
||
回答 |
|
| 回答者:yuu_yuu | #1です。 >一度目にボタンが押されたら stop = false >二度目にボタンが押されたら stop = true になります。 そうでしたか!! >if文も間違えてしまっています。 提示されているロジックには、if文一つしかありませんが、そこ以外のif文が間違えていたのでしょうか?? 後少し気になったのが、 g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; ↓ g_stop = false; g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); にした方が良いと思います。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/28 09:59 回答番号:No.2 |
|
| この回答への補足 | 指摘の通りそれは一度目は初期化しているの問題になりませんが 2度目以降は問題になるところだと思います。 ご指摘ありがとうございました。 VC関係の掲示板のサイトにも質問を記入してしまいましたので、 一箇所に纏める意味とマナーが悪いということもあってそちらに移りたいと思います。 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200803/08... 回答ありがとうございました。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| 回答者:yuu_yuu | まず、上に日本語で書かれているようなロジックになっていません。 main関数の最初のif文(if(!stop))で、 thenのとき スレッド生成 ※g_stopがtrueにならないので、スレッド内で無限ループ elseのとき スレッドの終了を待つ(WaitForSingleObject) ※スレッドは生成されていない となっています。 上の問題が解決しても、まだ他の問題が出てきそうですが。。。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/27 17:59 回答番号:No.1 |
|
| この回答への補足 | すみません…書き間違いです。 正確にはメインではなく、ボタンが押された場合なので 一度目にボタンが押されたら stop = false 二度目にボタンが押されたら stop = true になります。 if文も間違えてしまっています。すみません。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |