- ベストアンサー
ATL CWorkerThreadを使ったマルチスレッドプログラミングの利用法について教えてください。
- ATLのCWorkerThreadを使用してマルチスレッドプログラミングを行いたい場合、以下の手順に従います。
- まず、CWorkerThreadクラスのインスタンスを作成します。次に、CWorkerThread::Initializeメソッドを呼び出します。その後、CWorkerThread::AddHandleメソッドを使用して、カーネルオブジェクトのハンドルとIWorkerThreadClientの実装へのポインタを指定します。
- または、CWorkerThread::AddTimerメソッドを使用して、IWorkerThreadClientの実装へのポインタを指定します。次に、IWorkerThreadClient::Executeメソッドを実装し、ハンドルまたはタイマがシグナルを送信した際にアクションを実行します。最後に、CWorkerThread::RemoveHandleメソッドを呼び出して、待機可能オブジェクトのリストからオブジェクトを削除し、CWorkerThread::Shutdownメソッドを呼び出してスレッドを終了します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サンプルを作ってみました。一応それらしく動作しました。カーネルオブジェクトとしてイベントオブジェクトを生成しています。 ----- class CWorkerClient: public IWorkerThreadClient { public: CWorkerClient() {}; HRESULT Execute(DWORD_PTR dwParam, HANDLE hObject); HRESULT CloseHandle(HANDLE hHandle); }; HRESULT CWorkerClient::Execute(DWORD_PTR dwParam, HANDLE hObject) { ::printf("Child = %d, Param = %08lx\n", ::GetCurrentThreadId(), dwParam); return S_OK; } HRESULT CWorkerClient::CloseHandle(HANDLE hHandle) { ::CloseHandle(hHandle); return S_OK; } int _tmain(int argc, _TCHAR* argv[]) { CWorkerThread<Win32ThreadTraits> cWth; CWorkerClient cWcl; cWth.Initialize(); HANDLE hEvent; hEvent = ::CreateEvent(NULL, FALSE, FALSE, _T("MyEvent")); DWORD_PTR dwParam = 0x1234; cWth.AddHandle(hEvent, &cWcl, dwParam); ::printf("Parent = %d\n", ::GetCurrentThreadId()); ::printf("Hit [ENTER] to signal the object "); ::fflush(stdout); getchar(); ::SetEvent(hEvent); ::Sleep(1000); ::printf("Hit [ENTER] again to quit this program "); ::fflush(stdout); getchar(); cWth.RemoveHandle(hEvent); cWth.Shutdown(); return 0; }
その他の回答 (1)
- oldroot2005
- ベストアンサー率66% (68/103)
自宅の VC++ 2005 は Express Edition で ATL をサポートしておらず、サンプルが示せないので、疑問点へのコメント(ヒント)のみでご容赦。 「カーネルオブジェクトのハンドル」には色々な種類があります。たとえばファイルを開いた(CreateFile)ときに返されるハンドル、イベントオブジェクトを生成した(CreateEvent)ときに返されるハンドル、プロセスやスレッドを起動した(CreateProcess, CreateThread)ときに返されるハンドル、などなど。そして、カーネルオブジェクトは、ある条件(たとえば、プロセスやスレッドの終了)により「シグナル状態」になります。 おそらく、AddHandle には、このようなハンドルのどれでも指定できるのではないでしょうか。そして、ハンドルで指定したオブジェクトがシグナル状態になると Execute が呼ばれるのだと思います(MSDN日本語版の「シグナルを送信」は誤訳です)。
お礼
ご回答ありがとうございました。 なるほど、サンプル非常にわかりやすかったです。