
初歩的な質問で申し訳ないですが、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を渡せばよいかで躓いています。
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;
}
No.1
- 回答日時:
自宅の VC++ 2005 は Express Edition で ATL をサポートしておらず、サンプルが示せないので、疑問点へのコメント(ヒント)のみでご容赦。
「カーネルオブジェクトのハンドル」には色々な種類があります。たとえばファイルを開いた(CreateFile)ときに返されるハンドル、イベントオブジェクトを生成した(CreateEvent)ときに返されるハンドル、プロセスやスレッドを起動した(CreateProcess, CreateThread)ときに返されるハンドル、などなど。そして、カーネルオブジェクトは、ある条件(たとえば、プロセスやスレッドの終了)により「シグナル状態」になります。
おそらく、AddHandle には、このようなハンドルのどれでも指定できるのではないでしょうか。そして、ハンドルで指定したオブジェクトがシグナル状態になると Execute が呼ばれるのだと思います(MSDN日本語版の「シグナルを送信」は誤訳です)。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- Access(アクセス) ACCESS2019でのエラーメッセージ 1 2023/08/15 17:40
- PHP クラス 1 2022/08/08 15:12
- 哲学 形相的距離 1 2022/12/28 09:57
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Visual Basic(VBA) <excel vba>selenium basicのWebDriverの自動更新のエラーについて 1 2022/10/01 17:07
- Visual Basic(VBA) Excel VBA オブジェクトマクロ 使用指定について お詳しい方教えてください。 共通エクセルフ 2 2023/03/14 17:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAにて動的にCheckBOXを...
-
EXCELのドロップダウンリストに...
-
bmp画像をjpegやpng画像に圧縮...
-
int + Integer
-
インスタンスとオブジェクト 生成
-
デザインパターンとは?
-
パワーポイントのVBAでテキスト...
-
複数シートの選択
-
オブジェクトの参照とは
-
ページのソースを動的に書き換...
-
CFileDialogでフォルダだけを選...
-
C++で*thisは何を指しているの...
-
java.io.Serializableとは何で...
-
Object型からDouble型へのキャスト
-
ワイルドカード<?>と型パラメー...
-
C言語の「->」の意味
-
クラスと構造体
-
ATL CWorkerThread
-
XAMLの動的生成について
-
COMコンポーネントって何?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
時間帯判定をする。
-
newは明示的にした方が良いのか?
-
戻り値がクラスオブジェクト
-
ワイルドカード<?>と型パラメー...
-
error C2712: オブジェクト ア...
-
Accessの連結・非連結オブジェ...
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
多人数のじゃんけんプログラム
-
Rangeオブジェクトを一時的に作...
-
ワードで画像をドロップすると...
おすすめ情報