在從CWinThread派生的類中, 實際的線程函數該在何處調用?在如下代碼中, CreateThread()調用後線程應該已產生, 但::WaitForSingleObject為何一直得不到響應?// CEThread派生自CWinThread
CEThread pThrd;
pThrd.CreateThread();
::WaitForSingleObject(pThrd.m_hThread, INFINITE);

解决方案 »

  1.   

    補充:
    // Go()為線程實現函數
    CEThread* pThrd = (CEThread*)AfxBeginThread(Go, NULL, THREAD_PRIORITY_NORMAL);
    ::WaitForSingleObject(pThrd->m_hThread, INFINITE);
    沒問題. 在上一種情況下, Go()應該在何處調用?
      

  2.   

    CWinThread 还需要 Go 么? 这和 MFC 与 SDK 的关系一样.
      

  3.   

    everandforever(Forever), 如果不需要 Go , 那線程的實現代碼放在那裡?
    昰不昰在InitInstance()中實現? ::WaitForSingleObject為何一直得不到響應? 謝謝.
      

  4.   

    CWinThread 就像 CWnd 类封装 defWndProc() 一样把线程函数给封装了. 它支持消息.至于怎么放GO,那要具体看情况吧.
      

  5.   

    everandforever(Forever), 可以舉个簡單例子嗎? 謝謝.
      

  6.   

    如果 你的线程不需要处理消息,那么就直接用 AFXBEGINTHREAD 好了。如果需要处理消息,那么就像从CWND派生窗口一样,从CWINTHREAD派生,然后添加消息映射。
      

  7.   

    everandforever(Forever)
    在如下代碼中, CreateThread()調用後線程應該已產生, 但::WaitForSingleObject為何一直得不到響應?// CEThread派生自CWinThread
    CEThread pThrd;
    pThrd.CreateThread();
    ::WaitForSingleObject(pThrd.m_hThread, INFINITE);
      

  8.   

    线程退出了,HANDLE才会变为signaled的吧?
      

  9.   

    everandforever(Forever), 可以舉个有源碼的簡單例子嗎? 萬分感謝.
      

  10.   

    如果你的线程不需要响应消息,那么你可以重载CWInthread的Run()函数
    把线程的实现代码放在Run()函数中,注意重载Run()函数时要将最后
    的那句return CWinThread::Run();去掉.如果你的线程还需要响应消息
    那么就要按照实际情况来添加代码了.基于CWinThread类的线程和普通线程的区别就在于基于CWinThread类的线程
    多出了一个消息泵,这个消息泵就是这个Run()函数。你的线程之所以不退出就是因为线程进入了一个消息循环,等待处理消息
    如果你不发送一个消息让线程结束的话这种线程是不会自动退出的
      

  11.   

    另外补充一下:
    这个线程首先会调用InitInstance()函数
    然后接下来就执行Run()函数
    如果没有重载Run()函数就会进入一个消息循环
    等待处理消息没有特殊情况一般不要重载Run()函数,因为重载了
    Run()函数也就在一定程度上破坏了这个线程的消息泵没了消息泵的这种线程和普通线程相比就没有任何有优势的地方了