了解MsgWaitForMultipleObjects [英] Understanding MsgWaitForMultipleObjects
问题描述
我有一个主gui线程,我希望对用户操作保持响应,例如,移动对话框,调整大小等,而我有一个后台线程来执行某些任务.过去,我在等待后台线程完成的同时使用带有超时的WaitForSingleObject来处理gui事件.最近,我读到有关MsgWaitForMultipleObjects的文章,该文章似乎正在解决我的清洁问题.
I have a main gui thread that I want to remain responsive to the users action such as moving the dialog around, resizing, etc while I have a background thread doing some task. In the past I've used WaitForSingleObject with a timeout in order to process gui events while waiting on the background thread to complete. I recently read about MsgWaitForMultipleObjects which looked to be solving the problem that I had a little bit cleaner.
有人可以告诉我以下代码中的错误吗?我在哪里错了?当我单击该按钮以启动线程时,gui没有响应.我制作了一个对话框应用程序,该应用程序具有在主ui线程上播放的avi.我有一个启动线程的按钮,并使用MsgWaitForMultipleObjects等待线程句柄,但允许处理所有消息,最终在线程完成/发出信号时中断.
Can someone tell me the bugs in the following code & where I'm going wrong here? The gui is unresponsive when I click the button to start the thread. I made a dialog app with an avi that is playing on the main ui thread. I have a button to start a thread and use MsgWaitForMultipleObjects to wait on the thread handle but allow all messages through to be processed ultimately breaking when the thread is finished/signaled.
谢谢.
UINT MyThreadProc( LPVOID pParam )
{
ThreadData* pObject = (ThreadData*)pParam;
if (pObject == NULL ||
!pObject->IsKindOf(RUNTIME_CLASS(ThreadData)))
return 1;
// Do some processing.
int x = 0;
while (x++ < 5000)
{
for (int i=0; i<50000; i++)
double sum = sqrt((double)i+1) * sqrt((double)i+2);
}
return 0;
}
按钮处理程序
void Cmsgwait_demoDlg::OnBnClickedBtnStartThread()
{
m_pThreadData = new ThreadData;
CWinThread* pWorkThread = AfxBeginThread(MyThreadProc, m_pThreadData);
m_status.SetWindowText("Status: Waiting for thread to complete.");
HANDLE handles[] = { pWorkThread->m_hThread };
DWORD ret = 0;
do
{
ret = MsgWaitForMultipleObjects(1, handles, FALSE, INFINITE, QS_ALLINPUT);
if (ret == WAIT_OBJECT_0)
{
m_status.SetWindowText("Status: Thread completed.");
}
else if (WAIT_IO_COMPLETION)
{
m_status.SetWindowText("Status: User mode APC queued.");
}
else if (WAIT_FAILED)
{
m_status.SetWindowText("Status: Wait failed");
}
}
while (ret != WAIT_OBJECT_0 && ret != WAIT_FAILED);
}
推荐答案
您没有处理UI线程的传入消息,请使用此处)以获取示例.
You are not processing the incoming message of the UI thread, take a look at Raymond's blog (also see here) for a sample.
while (true) {
switch (MsgWaitForMultipleObjects(1, &h,
FALSE, INFINITE, QS_ALLINPUT)) {
case WAIT_OBJECT_0:
DoSomethingWith(h); // event has been signalled
break;
case WAIT_OBJECT_0+1:
// we have a message - peek and dispatch it
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
// TODO: must handle WM_QUIT; see Raymond's blog for details
TranslateMessage(&msg);
DispatchMessage(&msg);
}
break;
default:
return FALSE; // unexpected failure
}
}
这篇关于了解MsgWaitForMultipleObjects的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!