WM_の使用QUIT終端スレッド
スレッド1の関数を次に示します.
スレッド1関数にメッセージループがあり、スレッド2でスレッド1を終了させたいと考えているが、スレッド2を自然に終了させるために、ここではスレッド1にメッセージWM_を配信するQUIT,::PostThreadMessage(dwThreadID1, WM_QUIT, 0, 0); ThreadFun 1のメッセージループでGetMessageがWM_を受信するとQUITは、ループを終了します.では、このようにするのは何か問題がありますか?
スレッド1がメッセージキューを持つ前にWM_を送信する場合QUITでは、メッセージが失われます.つまり、ThreadFun 1がGDI関数を実行する前に(スレッドがGDI関数を実行すると、OSはスレッドにメッセージキューを作成する)、そのスレッドにメッセージを配信すると、ThreadFun 1のメッセージループはそのメッセージを受信できない.この問題をどのように解決しますか?
ThreadFun 1の一番前に:MSG msg;:PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); これにより、スレッド1がメッセージサイクル中にWM_を受信できることが保証されるQUITメッセージ.
- ThreadFun1
- {
- ....// A
- while (::GetMessage(&msg, NULL, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- ...//B
- }
スレッド1関数にメッセージループがあり、スレッド2でスレッド1を終了させたいと考えているが、スレッド2を自然に終了させるために、ここではスレッド1にメッセージWM_を配信するQUIT,::PostThreadMessage(dwThreadID1, WM_QUIT, 0, 0); ThreadFun 1のメッセージループでGetMessageがWM_を受信するとQUITは、ループを終了します.では、このようにするのは何か問題がありますか?
スレッド1がメッセージキューを持つ前にWM_を送信する場合QUITでは、メッセージが失われます.つまり、ThreadFun 1がGDI関数を実行する前に(スレッドがGDI関数を実行すると、OSはスレッドにメッセージキューを作成する)、そのスレッドにメッセージを配信すると、ThreadFun 1のメッセージループはそのメッセージを受信できない.この問題をどのように解決しますか?
ThreadFun 1の一番前に:MSG msg;:PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); これにより、スレッド1がメッセージサイクル中にWM_を受信できることが保証されるQUITメッセージ.