2011-09-21 65 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