スレッドについて勉強中なのですが、簡単なスレッド作り、
スレッドの処理が終わってからメインの処理を行わせたくて
以下のようなプログラムを書いてみました。
そこで、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("スレッドを終了します。")
}
No.1ベストアンサー
- 回答日時:
まず、上に日本語で書かれているようなロジックになっていません。
main関数の最初のif文(if(!stop))で、
thenのとき スレッド生成
※g_stopがtrueにならないので、スレッド内で無限ループ
elseのとき スレッドの終了を待つ(WaitForSingleObject)
※スレッドは生成されていない
となっています。
上の問題が解決しても、まだ他の問題が出てきそうですが。。。
この回答への補足
すみません…書き間違いです。
正確にはメインではなく、ボタンが押された場合なので
一度目にボタンが押されたら stop = false
二度目にボタンが押されたら stop = true になります。
if文も間違えてしまっています。すみません。
No.2
- 回答日時:
#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. …
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CWnd::OnTimerのスレッドの取得
-
VB2005 シリアル通信のClose処理
-
スレッドにて同一メモリの書き...
-
メモリアクセスの競合について
-
クリティカルセクションの使用...
-
待機関数(WaitForMultipleObjec...
-
同一スレッドで、ロックをかけ...
-
マルチスレッドプログラミング...
-
VC++スレッドの正しい終了のさ...
-
スレッドの安全な終了のさせ方
-
.netアプリへのSendMessageでフ...
-
MFC通信プログラムマルチスレッ...
-
マルチスレッドでの画像描画
-
別スレッドのデータを受信できない
-
スレッドの終了を知りたい(Wind...
-
スレッドの終了はどうやるんで...
-
Macターミナルで実行中のプログ...
-
プロダクションコードとは?
-
3のつく数字と3の倍数のみを表...
-
c言語のサイコロを100回振って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
スレッドの安全な終了のさせ方
-
メインスレッドのPostMessageと...
-
C# スレッドから親ウィンドウへ...
-
別スレッドからメインダイアロ...
-
スレッドの終了はどうやるんで...
-
MFC通信プログラムマルチスレッ...
-
同一スレッドで、ロックをかけ...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
LinuxでDoEvents()同等機能
-
C#でスレッド実行中のイベント...
-
msec単位のWait Timerが作れない!
-
スレッド終了を待つ間に開放さ...
-
win32 スレッドのハンドルついて
おすすめ情報