请教一个PeekMessage的问题
一个程序有两个线程,一个为主线程(UI线程),另一个为工作线程。工作线程把取得的数据通过SendMessage发送到主UI线程,进行显示。当用户进行关闭主窗口的操作时,我通过改变标志位(g_bStopEvent)的方式让主线程通知工作线程结束工作。这个程序能够很好的工作,只是我还有些地方不太明白。程序代码如下:
bool g_bStopEvent;
HANDLE g_hWorkThread;
HANDLE hMainWnd;
g_bStopEvent = false;
CMyDialog myDlg;
hMainWnd = myDlg.m_hWnd;
// UI主线程
CMyDialog::OnClose()
{
g_bStopEvent = true;
WaitFor(g_hWorkThread); // 等待工作线程结束
CDialog::OnClose();
}
BOOL CMyDialog::WaitFor(HANDLE hThread)
{
MSG msg;
HANDLE handle[1];
handle[0] = hThread;
DWORD dwWaitResult = 0;
do
{
// This prevents a potential deadlock if the background thread
// does a SendMessage to the foreground thread
if (dwWaitResult == WAIT_OBJECT_0 + 1)
PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE); // 这里
dwWaitResult = MsgWaitForMultipleObjects(1, handle, false, 1000, QS_SENDMESSAGE);
if (dwWaitResult == WAIT_FAILED)
return FALSE;
}while (dwWaitResult != WAIT_OBJECT_0);
return TRUE;
}
// Worker线程
unsigned __stdcall ThreadFunc(void* pArguments)
{
while (g_bStopEvent != false)
{
SendMessage(hMainWnd, WM_COPYDATA...);
}
return 0;
}
问题是: PeekMessage是怎样对工作线程发出的消息进行处理的?