windowsAPIです。
「一つ前のスレッドがおわったら次のスレッドを呼ぶ」
を表現するのにもっとも適当な関数はありますでしょうか。
例えば
①CreateThread_funcの引数DWORD dwCreationFlags
にCREATE_SUSPENDEDを指定して動的に複数のスレッドを保存
HANDLE chandle[int]
=
CreateThread(
_In_opt_
,_In_
,_In_
,_In_opt_
, CREATE_SUSPENDED
,_Out_opt_
);
②次に、
「 ResumeThread でハンドルを指定してスレッドを呼ぶ。」
これを
「一つ前のスレッドがおわったら次のスレッドを呼ぶ」
にしたいと思っています。
void Class::func(){
・・・・・
・・・・・
ResumeThread(chandle[int]);
・・・・・
・・・・・
}
「ひとつ前のスレッド」のHANDLEがわかってるなら、
WaitForSingleThread-API で終了を待てばいぃんじゃなくて?
ごめんマチガイ。
× WaitForSingleThread
○ WaitForSingleObject
ご回答ありがとうございます。
「一つ前のスレッドがおわったら次のスレッドを呼ぶ」
は実は、
「連続して送り込んだ多数のスレッドを一定間隔で処理させる。」
ということでして、
これは手動では可能なので、自動で行う最も適当な方法を
考えてたのですが、いまのところtimerを使うしかないかな・・
というところです。
参考
GetExitCodeThread() スレッドの生存を知る
http://blogs.yahoo.co.jp/heroherostocks/93573.html
「複数のスレッドのうち、どれか一つが終了するまで待つ」のなら
WaitForMultipleObjects でやれますが。
すみません・・・・
ウィンドウを作成するスレッドなので待機中に
メインメッセージループがとまってしまうのがちょっとまずいのです。
WaitForMultipleObjectsは待ち時間を0にすることで
「複数のスレッドのうち、どれか一つが終了しているか調べる」
ことができますが。
> ペンネーム さん
> ウィンドウを作成するスレッドなので待機中に
> メインメッセージループがとまってしまうのがちょっとまずいのです。
「連続して送り込んだ多数のスレッド」以外にこれらのスレッドを管理するだけのスレッド(メッセージループ無しの単純スレッド)を作成して、そのスレッドで WaitForSingleObject() or WaitForMultipleObjects() と ResumeThread() を繰り返す構造はいかがでしょう。
(「連続して送り込んだ多数のスレッド」は同時に複数スレッド動作するのか1つだけ動作するのかいまひとつ読み取れない)
> メインメッセージループがとまってしまう
MsgWaitForMultipleObjects でいいのでは。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684242%28v=vs.85%29.aspx
いろいろご回答いただきありがとうございました。
いまのところタイマーで十分なので、以下のようにタイマーの実装にしました。
void
Class::_CreateThread_(){
int
= int +1
;
HANDLE chandle[int]
=
CreateThread(
_In_opt_
,_In_
,_In_
,_In_opt_
, CREATE_SUSPENDED
,_Out_opt_
);
}
void
Class::_ResumeThread_(){
SetTimer(
_In_opt_
_In_
_In_
_In_opt_
);
}
・・・・・・・・・・
・・・・・・・・・・
//ボタン押下処理
IClass->_CreateThread_();
IClass->_ResumeThread_();
・・・・・・・・・・
・・・・・・・・・・
case WM_TIMER:
if(_int_Timer <= int){
ResumeThred(chandle[_int_Timer]);
_int_Timer
= _int_Timer + 1
;
else{
KillTimer(
_In_opt_
_In_
);
}
return 0
;
・・・・・・・・・・
・・・・・・・・・・
ツイート | ![]() |