スレッドの終了を知るには?

解決


ペンネーム  2013-06-30 07:27:50  No: 73732

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]); 
・・・・・
・・・・・
}


επιστημη  URL  2013-06-30 08:44:02  No: 73733

「ひとつ前のスレッド」のHANDLEがわかってるなら、
WaitForSingleThread-API で終了を待てばいぃんじゃなくて?


επιστημη  2013-06-30 08:45:23  No: 73734

ごめんマチガイ。
× WaitForSingleThread
○ WaitForSingleObject


ペンネーム  2013-06-30 10:13:23  No: 73735

ご回答ありがとうございます。
「一つ前のスレッドがおわったら次のスレッドを呼ぶ」
は実は、
「連続して送り込んだ多数のスレッドを一定間隔で処理させる。」
ということでして、
これは手動では可能なので、自動で行う最も適当な方法を
考えてたのですが、いまのところtimerを使うしかないかな・・
というところです。
参考
GetExitCodeThread() スレッドの生存を知る
http://blogs.yahoo.co.jp/heroherostocks/93573.html


επιστημη  2013-06-30 16:27:33  No: 73736

「複数のスレッドのうち、どれか一つが終了するまで待つ」のなら
WaitForMultipleObjects でやれますが。


ペンネーム  2013-06-30 20:59:52  No: 73737

すみません・・・・
ウィンドウを作成するスレッドなので待機中に
メインメッセージループがとまってしまうのがちょっとまずいのです。


επιστημη  2013-06-30 22:03:14  No: 73738

WaitForMultipleObjectsは待ち時間を0にすることで
「複数のスレッドのうち、どれか一つが終了しているか調べる」
ことができますが。


zeek  2013-07-01 04:30:31  No: 73739

> ペンネーム さん
> ウィンドウを作成するスレッドなので待機中に
> メインメッセージループがとまってしまうのがちょっとまずいのです。
「連続して送り込んだ多数のスレッド」以外にこれらのスレッドを管理するだけのスレッド(メッセージループ無しの単純スレッド)を作成して、そのスレッドで WaitForSingleObject() or WaitForMultipleObjects() と ResumeThread() を繰り返す構造はいかがでしょう。
(「連続して送り込んだ多数のスレッド」は同時に複数スレッド動作するのか1つだけ動作するのかいまひとつ読み取れない)


kumatti  2013-07-01 16:36:10  No: 73740

> メインメッセージループがとまってしまう

MsgWaitForMultipleObjects でいいのでは。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684242%28v=vs.85%29.aspx


ペンネーム  2013-07-06 09:27:44  No: 73741

いろいろご回答いただきありがとうございました。
いまのところタイマーで十分なので、以下のようにタイマーの実装にしました。
  

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
;
・・・・・・・・・・
・・・・・・・・・・


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加