電子書籍の厳選無料作品が豊富!

スレッドについて勉強中なのですが、簡単なスレッド作り、
スレッドの処理が終わってからメインの処理を行わせたくて
以下のようなプログラムを書いてみました。

そこで、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("スレッドを終了します。")
}

A 回答 (2件)

まず、上に日本語で書かれているようなロジックになっていません。



main関数の最初のif文(if(!stop))で、
thenのとき スレッド生成
       ※g_stopがtrueにならないので、スレッド内で無限ループ
elseのとき スレッドの終了を待つ(WaitForSingleObject)
       ※スレッドは生成されていない

となっています。

上の問題が解決しても、まだ他の問題が出てきそうですが。。。

この回答への補足

すみません…書き間違いです。
正確にはメインではなく、ボタンが押された場合なので

一度目にボタンが押されたら stop = false
二度目にボタンが押されたら stop = true になります。

if文も間違えてしまっています。すみません。

補足日時:2008/03/27 18:18
    • good
    • 0

#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);
にした方が良いと思います。

この回答への補足

指摘の通りそれは一度目は初期化しているの問題になりませんが
2度目以降は問題になるところだと思います。

ご指摘ありがとうございました。
VC関係の掲示板のサイトにも質問を記入してしまいましたので、
一箇所に纏める意味とマナーが悪いということもあってそちらに移りたいと思います。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng. …

回答ありがとうございました。

補足日時:2008/03/28 11:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!