重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

初歩的な質問で申し訳ないですが、ATLにおけるCWorkerThreadを使ってマルチスレッドプログラミングをしたいのですが、情報が少なく、msdnを見てもサンプルが無いようなので利用法がいまいちわかりません。
どなたか簡単なサンプルでもよいので教えていただけないでしょうか。

具体的には、以下の解説
http://msdn.microsoft.com/library/ja/default.asp …

-----------------------------------------

CWorkerThread クラスを使用するには

1. このクラスのインスタンスを作成します。
2. CWorkerThread::Initialize を呼び出します。
3. CWorkerThread::AddHandle を、カーネル オブジェクトのハンドルと、IWorkerThreadClient の実装へのポインタを指定して呼び出します。

または

CWorkerThread::AddTimer を IWorkerThreadClient の実装へのポインタを指定して呼び出します。
4. IWorkerThreadClient::Execute を実装し、ハンドルまたはタイマがシグナルを送信したときにアクションを実行します。
5. CWorkerThread::RemoveHandle を呼び出して、待機可能オブジェクトのリストからオブジェクトを削除します。
6. CWorkerThread::Shutdown を呼び出して、スレッドを終了します。

------------------------

の3の、カーネル オブジェクトのハンドルが何かがよくわかりません。AddHandleに何のHANDLEを渡せばよいかで躓いています。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
なるほど、サンプル非常にわかりやすかったです。

お礼日時:2007/04/04 22:21

自宅の VC++ 2005 は Express Edition で ATL をサポートしておらず、サンプルが示せないので、疑問点へのコメント(ヒント)のみでご容赦。



「カーネルオブジェクトのハンドル」には色々な種類があります。たとえばファイルを開いた(CreateFile)ときに返されるハンドル、イベントオブジェクトを生成した(CreateEvent)ときに返されるハンドル、プロセスやスレッドを起動した(CreateProcess, CreateThread)ときに返されるハンドル、などなど。そして、カーネルオブジェクトは、ある条件(たとえば、プロセスやスレッドの終了)により「シグナル状態」になります。
おそらく、AddHandle には、このようなハンドルのどれでも指定できるのではないでしょうか。そして、ハンドルで指定したオブジェクトがシグナル状態になると Execute が呼ばれるのだと思います(MSDN日本語版の「シグナルを送信」は誤訳です)。
    • good
    • 0

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