我有一个进行冗长处理的线程。在等待线程完成时,我启动了另一个“显示进度”线程,它只是来回切换位图以显示程序正在处理数据。令我惊讶的是,这种方法根本不起作用。
我的“show progerss”线程只是在主活动开始时停止更新(=运行),并在该活动结束时开始更新。这几乎与我想要的相反!我是否应该期待这种行为,因为WaitForSingleOBject
它大部分时间都处于等待状态并短暂唤醒?
// This is the main thread that does the actual work
CWinThread* thread = AfxBeginThread(threadDoWork, this, THREAD_PRIORITY_LOWEST, 0, CREATE_SUSPENDED );
thread->m_bAutoDelete = FALSE;
thread->ResumeThread();
// before I start to wait on the above thread, I start this thread which will toggle image to show application is processing
AfxBeginThread(ProgressUpdateThread, &thread_struct_param, THREAD_PRIORITY_NORMAL, 0 );
// wait for the main thread now.
DWORD dwWaitResult = WaitForSingleObject( thread->m_hThread, INFINITE );
DWORD exitCode;
::GetExitCodeThread( thread->m_hThread, &exitCode );
delete thread;
// This thread toggles image to show activity
UINT ProgressUpdateThread(LPVOID param)
{
CEvent * exitEvent = ((mystruct *)param)->exitEvent;
MyView *view ((mystruct *)param)->view;
int picture = 0;
do
{
waitResult = WaitForSingleObject( exitEvent->m_hObject, 100);
if (waitResult == WAIT_TIMEOUT)
{
picture = toggle ? 1: 0;
// invert
toggle = !toggle;
View->Notify( UPDATE_IMAGE, picture );
}
else if (waitResult == WAIT_OBJECT_0)
{
return TRUE;
}
}
while( 1);
}
我的解决方案中的另一个考虑因素是我不想触及实际的“DoWork”线程代码,这也是我使用单独的线程来更新 GUI 的原因。我可以使这种方法起作用吗?更新 GUI 可靠的唯一方法是从实际的 'DoWork 线程本身更新它吗?
我确实想澄清一下,如果应用程序空闲,我的“显示进度”线程可以完美地完成工作,但是如果我启动工作线程操作(以较低的线程优先级),更新 gui 线程只会停止运行并仅在工作线程时恢复完成。
我正在使用 Windows 7。