DWORD WINAPI ThreadProc(void* p)
/*线程控制函数*/
{
 
  MSG msg;
  while (::GetMessage(&msg, NULL, 0, 0))
  {
    switch(msg.message)
    {
        case MYMESSAGE:
            dosomething();
            /*在这里完成主程序传来的任务*/
              busy[*(int*)p]=false;
            /*工作完成,设置为不忙*/
            break;
  
        default:
            break;
    }
  }
  return 0;
}这么改怎么样?

解决方案 »

  1.   

    GetMessage(&msg, NULL, 0, 0)在得到WM_QUIT消息后,返回值是0吧?  
      

  2.   

    ThreadProc(void* p)busy[*(int*)p]=false;里的(void* p), 和[*(int*)p]是什么意思呢?不好意思,我只学过(int)p之类的类型转换。
                
      

  3.   

    以下是小李子的个人理解.void* p : p 是void(未定义)类型的指针
    [*(int*)p] : 将void类型的指针p转换为int类型的指针,然后取出该指针地址中的值(是值不是地址)就这样
      

  4.   

    再问个问题:  while (::GetMessage(&msg, NULL, 0, 0))
      {
        switch(msg.message)
        {
          ...
          case WM_QUIT:
              return 5;  
          ...    }
      }有可能被执行到吗?
              
      

  5.   

    是不是读到WM_QUIT就直接退出while()循环了?
      

  6.   

    对,WM_QUIT是无法被消息循环接收到的(不论MFC和WIN API)
      

  7.   

    线程控制函数的return值,有什么特殊的约定吗?
      

  8.   

    线程的return值一般用处不大,但是可以用
    BOOL GetExitCodeThread(
      HANDLE hThread,      // handle to the thread
      LPDWORD lpExitCode   // address to receive termination status
    );
    获得线程的退出值,如果你想知道线程为什么退出从哪里退出的话
    如果线程依然运行, GetExitCodeThread得到的是STILL_ACTIVE
     
     
      

  9.   

    STILL_ACTIVE的值和STATUS_PENDING是一样的
    #define STATUS_PENDING                   ((DWORD   )0x00000103L)  
    所以最好不用这个值做thread的return值。