我有一個線程,做冗長的處理。在我等待線程完成時,我啓動了另一個「顯示進度」線程,它簡單地來回切換位圖以顯示程序正在處理數據。令我驚訝的是,這個方法根本行不通。我的'顯示進度線程'不運行時,它計數
我的'顯示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
通常,任何時候進度線程都無法更新UI,這是因爲所述UI不是通過消息循環泵送消息。自從我在MFC中完成線程工作以來,它一直是*永遠*,但是必須有樣本來說明如何在某個地方正確地完成這個任務。也許['MsgWaitForMultipleObjects()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684242(v = vs.85).aspx)(仔細閱讀文檔*,其中的a使用起來有點棘手),一個適當管理的味精泵將做你想做的。這聽起來像你的主線程忙於處理一些東西,並沒有爲其循環服務 – WhozCraig
實際上,在這種情況下,我直接從update-gui線程更新GUI。我知道有這樣的優點和缺點,但只要一個線程更新gui,它應該沒問題。 – zar
它應該工作。如果你是主線程的確在服務一個msg-loop,那麼其他東西必須丟失。 – WhozCraig