ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者: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文も間違えてしまっています。すみません。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示