なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

イベント処理メモ



やりたいこと: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による「メインループ」処理

参考: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でのスレッド間通信 - なんとな~くしあわせ?の日記