ATL CWorkerThreadを使ったマルチスレッドプログラミングの利用法について教えてください。

このQ&Aのポイント
  • ATLのCWorkerThreadを使用してマルチスレッドプログラミングを行いたい場合、以下の手順に従います。
  • まず、CWorkerThreadクラスのインスタンスを作成します。次に、CWorkerThread::Initializeメソッドを呼び出します。その後、CWorkerThread::AddHandleメソッドを使用して、カーネルオブジェクトのハンドルとIWorkerThreadClientの実装へのポインタを指定します。
  • または、CWorkerThread::AddTimerメソッドを使用して、IWorkerThreadClientの実装へのポインタを指定します。次に、IWorkerThreadClient::Executeメソッドを実装し、ハンドルまたはタイマがシグナルを送信した際にアクションを実行します。最後に、CWorkerThread::RemoveHandleメソッドを呼び出して、待機可能オブジェクトのリストからオブジェクトを削除し、CWorkerThread::Shutdownメソッドを呼び出してスレッドを終了します。
回答を見る
  • ベストアンサー

ATL CWorkerThread

初歩的な質問で申し訳ないですが、ATLにおけるCWorkerThreadを使ってマルチスレッドプログラミングをしたいのですが、情報が少なく、msdnを見てもサンプルが無いようなので利用法がいまいちわかりません。 どなたか簡単なサンプルでもよいので教えていただけないでしょうか。 具体的には、以下の解説 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/vclrfcworkerthread.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を渡せばよいかで躓いています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

________j_
質問者

お礼

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

その他の回答 (1)

回答No.1

自宅の VC++ 2005 は Express Edition で ATL をサポートしておらず、サンプルが示せないので、疑問点へのコメント(ヒント)のみでご容赦。 「カーネルオブジェクトのハンドル」には色々な種類があります。たとえばファイルを開いた(CreateFile)ときに返されるハンドル、イベントオブジェクトを生成した(CreateEvent)ときに返されるハンドル、プロセスやスレッドを起動した(CreateProcess, CreateThread)ときに返されるハンドル、などなど。そして、カーネルオブジェクトは、ある条件(たとえば、プロセスやスレッドの終了)により「シグナル状態」になります。 おそらく、AddHandle には、このようなハンドルのどれでも指定できるのではないでしょうか。そして、ハンドルで指定したオブジェクトがシグナル状態になると Execute が呼ばれるのだと思います(MSDN日本語版の「シグナルを送信」は誤訳です)。

関連するQ&A

  • XMLパーサー(であってるのかな?)について

    いつもお世話になっています。 VB6.0でXMLファイルを読み込むプログラムを修正しています。 参照設定で「Microsoft XML,version2.0(msxml.dll)」というのを使用しています。 そこで、みなさんにお伺いしたいのが、 このオブジェクトのヘルプファイルの場所なんです。 正直言っていろいろなメンバーがあったり、メソッドがあったり しても、何を書いてるのか「やんわりと」しかわかりません(;_;) MSDNでそれらしきライブラリを見つけたのですが、 微妙に名前が違ってて、それでもいいのかわからず・・・ ヘルプドキュメント(MSDNなど)の場所をご存知の方 いらっしゃいましたら、教えて下さい。 自分でみつけたのは 1 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemxmlxmlnodememberstopic.asp 2 http://www.microsoft.com/japan/msdn/xml/general/beginner.asp#What でした。これであってるのでしょうか? 2は、まさにやってるのは「これ」なんですが、あまりにも概要だけで、細かい処理の内容までわかりません。 みなさんよろしくお願いします。

  • WindowsAPIの調べ方

    わからない事があったら「MSDN ライブラリ http://www.microsoft.com/japan/msdn/library/default.asp で調べよう」というのをよくみかけるのですが 例えばWindowsAPIのCreateFiber関数を調べたい場合 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnroad/htm/devmobfaq.asp に説明がでていますが Microsoft.com Japan サイトの検索で「CreateFiber」を検索しても 上記のURLはでてきません。 MSDN ライブラリを使ってAPI等を調べるとき 皆さんはどのようにされているのでしょうか? 効率的な検索方法を知りたいです。 よろしくお願いします。

  • C#でコマンドラインからコンパイルする時のパス設定

    Microsoftのヘルプページもみたのですが、わかりませんでした。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cscomp/html/vcgrfbuildingfromcommandline.asp csc file.cs としても、コンパイルできません。 わかるかたお願いします。

  • C#の同一プロジェクト内でWindowsフォームを継承するには?

    いつもお世話になっております。 現在C#でWindowsアプリケーションを作成している ところなんですが、不明な点が解決できないため、 質問させていただきました。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtsksubclassingforms.asp に書いてある内容を参考にすると、別な プロジェクトで作成したクラスの Windowsフォームを継承するというのは 可能だということはわかったんですが、 同一のプロジェクト内で親クラスの Windowsフォームを子クラスが継承する 方法がわかりません。 ご存知の方がいらっしゃいましたら、 ご教授いただけませんでしょうか?

  • Wordファイルの結合

    VB6.0から複数のWordファイルを結合したいのですが、具体的な方法がわかりません。 開いてコピーペーストするには大きすぎるファイルなので、何か良い方法はないかと探しています。 aaa bbb ccc とファイルがあった場合に、aaaの最後にbbbを連結し、次にcccといったように処理をしたいと思っています。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnoxpta/htm/odc_filedlgobjs.asp こちらを見る限り、可能なように書いてありますが、サンプルへのリンクがなくなっていました。 ご教授、お願いいたします。

  • urlとは?

    url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassonmouse wheeltopic.asp こういうアドレス?はどうやってアクセスするのですか?

  • フォームを透過にしたい

    デスクトップアクセサリを作りたいのですが フォームを透過にし、透過gifを表示させるよい方法はないでしょうか? 当方のマシンはXPなので以下のサンプルを使用してみましたが当然?のごとく 「オブジェクトが必要です」とエラーになってしまいました。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskcreatingtransparentform.asp また、 http://www.nifty.com/download/win/prog/ocx/index3_09.htm の「フォーム透過OCX 2.00」を使用してみましたが メディアプレイヤーとアクセサリが重なった時、アクセサリがぼやけてしまい、うまくいきませんでした。 知り合いに聞いてみるとOCXがまずいということだけ言われました… 画像の形にくりぬく方法は当サイトにありましたがなにぶん複雑ですし背景を変更した時も自動で・・・となると非常に手間なんですよね… 大変わがままな質問でしょうけど回答よろしくお願いします。

  • <OBJECT>タグからJavascript呼び出し

    今まで一回も使ったことのない<OBJECT>タグと<PARAM>タグの扱いで困っています。 <OBJECT>タグからJavascriptを呼び出し、onclick時にwindow.close()したいのですが、どういうわけかちゃんと呼び出せません。 microsoftのDHTMLライブラリ(http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpisdk/dhtml/dhtml.asp)を見ると、eventも属性に指定できるとあるのですが、一体どうしたことなのでしょう? どなたか、<OBJECT>タグもしくは<PARAM>タグからJavascriptを呼び出す方法をご存知の方、お教えいただけませんでしょうか?(仕様上無理であれば、無理であることをお教えいただけると幸いです。)

    • ベストアンサー
    • HTML
  • C++でUNDOを実装しようとしています。

    C++でUNDOを実装しようとしています。 処理前にクラスオブジェクトをコピーしておき、 UNDOの処理では処理前のクラスを元のクラスに かぶせてしまえば処理前の状態に戻ると思うの です。 ところが、クラスオブジェクトの中でポインタ 変数があり、コピーした内容も書き換わってし まいます。 いわゆるディープコピーをしなければならない らしいということまで分かったのですが、その 方法がわかりません。 サンプルなどが掲載されているホームページが ありましたら、そのURLを教えてください。

  • VB2005ExpressEditionでのフォーム継承

    お世話になります。 VB2005ExpressEditionには継承ピッカーと呼ばれる機能が無い?ようですが、 フォーム継承(下記MSDNサイト)をする事は可能なのでしょうか? 可能ならばその方法を教えて下さい。 宜しくお願い致します。 ■チュートリアル : ビジュアル継承のデモンストレーション http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbcon/html/vbwlkwalkthroughdemonstratingvisualinheritance.asp