当按下 ID_OK 时, Thread 函数 从何时开始执行?0. DWORD WINAPI Thread(LPVOID lpvParam)  //需要执行的线程函数
    {
  
     //do something     return(0);
    }
   ....1. void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
2. {
3.    switch (id)
4.    {
5.      case IDOK:   //创建一个线程:
         
6.         hThread =(HANDLE)_beginthreadex(0, 0,Thread,(LPVOID)lpParam, 0,          &dwThreadId);
    
7.         CloseHandle(hThread);8.         break;    //可以肯定 从创建至此 Thread函数 不会执行        case IDCANCEL:
        
           break;
11.   }12. }    ....14. BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM lParam)
    {
  
  
15.   switch (uMsg)
      {16.      case (message): 
 
17.      return (SetDlgMsgResult(Dlg_OnCommand(hwnd,
                      LOWORD(wParam),
                      (HWND)lParam,(UINT)HIWORD(wParam))));
18.   }
      
19.  return(FALSE);20. }
    
   ....

解决方案 »

  1.   

    5.      case IDOK:   //创建一个线程:
             
    6.         hThread =(HANDLE)_beginthreadex(0, 0,Thread,(LPVOID)lpParam, 0,          &dwThreadId);
        
    7.         CloseHandle(hThread);8.         break;    //可以肯定 从创建至此 Thread函数 不会执行楼主,搞清楚多线程的概念。
    从宏观上说两个线程从6行就开始了!!
    是你在7行上close的。
      

  2.   

    这简单,
    当按下 ID_OK 时,线程被创建后就进入了执行队列。
    接下来,操作系统根据队列调度法则决定他的执行。如果系统非常空闲可以是立即执行,系统繁忙可以在n秒之后开始执行。每次运行都可以不同。
      

  3.   

    要CloseHandle(hThread);干什么?
    return(0);足够了。
      

  4.   

    这段程式也可以是这样的:BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    {
       switch (uMsg) 
      {
             case WM_INITDIALOG:
             .....
             return 0;
     
    case WM_COMMAND:
               switch (LOWORD(wParam)) 
               {
                   case IDOK:
                        Thread = chBEGINTHREADEX( NULL,0,Thread2,(LPVOID)hwnd, 0, &ids);
            // CloseHandle(Thread); 有没有无所谓,不影响。只是规范写法而已
                        Sleep(5000);//★
                   break;
                   
                  case IDCANCEL:
                       ......
                  break;

     }
              Sleep(5000);//★
       }   
       return(FALSE);
    }
    现在我想问的是:为什么在执行完整个Dlg_Proc 后,线程才开始执行?
    因为 系统白白在两个★处等了10秒 而没有做任何事,说明线程只是初始化,而没有运行线程函数? 那么线程函数的开始时机是什么呢?为何非要等窗口过程退出后才开始执行?
      

  5.   

    已解决。由于window为了确保窗口函数不会被过长时间的耽搁,拒绝在窗口函数中执行多线程