2011-09-21 61 views
0

我想使用一個線程做一些事情,不能立即返回,當我點擊一個名爲Button1的 這裏按鈕是我的代碼:Ç得到線程功能和UI線程的返回值stucked

LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
    case WM_INITDIALOG: 
     //do something....... 

    case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
     case IDC_BUTTON1: 
      { 
       HANDLE thread1; 
       DWORD exitCode; 
       DWORD thread1ID; 
       thread1 = CreateThread(NULL,0,threadProc,(LPVOID)2,0,&thread1ID); 
       WaitForSingleObject(thread1,INFINITE); 
       GetExitCodeThread(thread1,&exitCode); 

      } 
      return TRUE; 

     } 
     return TRUE; 
    //other code.................. 
    } 
    //return DefWindowProc (hWndDlg, Msg, wParam, lParam) ; 
    return FALSE; 
} 

thread1原型:

DWORD WINAPI thread1(LPVOID n) 
{ 
    Sleep((DWORD)n*1000*2); 
    return (DWORD)n * 10; 
} 

後,我單擊button(ID:IDC_BUTTON1),UI線程大約多久Sleep做的量stucked的。 如果我不使用WaitForSingleObjectexitCode總是返回259(STILL_ALIVE)?

我該怎麼做才能得到thread1的返回值,並且UI線程無法被打斷?

EDIT

使用PostThreadMessage

case IDC_BUTTON1: 
    { 
     HANDLE thread1; 
     DWORD exitCode; 
     DWORD thread1ID; 
     DWORD mainThreadId = GetCurrentThreadId(); 
     thread1 = CreateThread(NULL,0,threadProc,(LPVOID)mainThreadId,0,&thread1ID); 

    } 
    return TRUE; 

和在DlgProc一個新的消息:

case WM_FINISHED_FETCH: 
    MessageBox(NULL,NULL,NULL,MB_OK); 
    return TRUE; 

mainThreadId是UI線程ID。

threadProc

PostThreadMessage((DWORD)mainThreadId,WM_FINISHED_FETCH,0,0); 

代碼下WM_FINISHED_FETCH從未被觸發。

+0

重新更新:PostThreadMessage是一個壞主意。這需要在主消息循環中進行處理,因爲它在沒有目標窗口句柄的情況下發布。您應該調用PostMessage並傳遞目標的窗口句柄。 –

回答

1

如果您要阻止ui線程等待它,創建線程有什麼意義?如果您的其他線程完成後需要在ui線程上執行某些操作,請考慮向ui線程發送私人消息。請參閱PostThreadMessage

+0

我知道創建一個阻止UI線程的線程是無用的。所以我試圖阻止這種情況發生。我只是想在'thread1'完成後立即得到返回值併發送給主線程,所以我可以使用'exitCode'來完成下一步。你能給我一些這樣的代碼嗎? – tunpishuang

+0

沒有示例代碼,研究PostThreadMessage,以便您的執行線程可以告訴UI線程對其結果做些什麼。 –

+2

'PostThreadMessage'可以有一些奇怪的行爲。例如,如果您的UI代碼恰好位於具有自己的消息泵的模式對話框內(例如,像MessageBox一樣),則可能無法處理消息。在hwnd上使用'PostMessage'(甚至是不可見的hwnd僅用於消息目的)更可靠。 – asveikau