やりたいこと:WIN32アプリケーションのクロスプラットフォームな移植
WIN32 thread的処理をPOSIX threadで
peventが便利じゃぞ
neosmart/pevents · GitHub
たぶんこんな感じ?
あとで追記…
_beginthreadex
#ifdef _WIN32 /** win32 thread */ OtakuHandle = (HANDLE)_beginthreadex(NULL, 0, OtakuThread, this, 0, NULL); AhogeHandle = (HANDLE)_beginthreadex(NULL, 0, AhogeThread, this, 0, NULL); #else /** POSIX thread */ handles[0] = neosmart::CreateEvent(); handles[1] = neosmart::CreateEvent(); pthread_t otakuPThread; pthread_create(&otakuPThread, NULL, OtakuThread, this); pthread_t ahogePThread; pthread_create(&ahogePThread, NULL, AhogeThread, this); #endif
WaitForMultipleObjects
#ifdef _WIN32 /** win32 thread */ HANDLE handles[2] = { OtakuThreadHandle, AhogeThreadHandle }; WaitForMultipleObjects(2, handles, TRUE, INFINITE); CloseHandle(OtakuThreadHandle); CloseHandle(AhogeThreadHandle); OtakuThreadHandle = 0; AhogeThreadHandle = 0; #else /** POSIX thrad */ neosmart::WaitForMultipleEvents(handles, 2, TRUE, INFINITE); neosmart::DestroyEvent(handles[0]); neosmart::DestroyEvent(handles[1]); #endif
PeekMessageによる「メインループ」処理
・メッセージループ
ループ開始
自分にメッセージが送られてくるまで待つ
送られてきたメッセージをシステムに通知してメッセージ処理関数をコールバック
もしプログラム終了のメッセージなら終了処理ループ終了
・メインループ
ループ開始
自分にメッセージが送られているか調べる
送られていたらシステムに通知してメッセージ処理関数をコールバック
もしプログラム終了のメッセージなら終了処理送られていなければ独自の処理を実行
ループ終了
ここでは後者を実装したい
// WIN32な実装 while (1) { /* メインループ */ if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) /* メッセージ処理 */ return msg.wParam ; TranslateMessage(&msg); DispatchMessage(&msg); } else func(); /* 独自の処理 */ }
wxWidgetsでは何を使う?
wxIdleEventを使う
参考:wxWidgets: wxIdleEvent Class Reference
参考:DirectXな"Hello World" with wxWidgets
WIN32のSendMessage, PostMessageに当たるもののサンプルは、以下のエントリに書いている
wxWidgetsでのスレッド間通信 - なんとな~くしあわせ?の日記