程序意图是:当点吉 "挂起"按钮时,会产生一线程,该线程的处理函数如下:DWORD WINAPI ThreadFun(PVOID pvParam)
{
HANDLE hThreadPrimary=(HANDLE) pvParam;
::SuspendThread(hThreadPrimary);
AfxMessageBox("主线程已被挂起");----------问题处
::ResumeThread(hThreadPrimary);
CloseHandle(hThreadPrimary);

return(0);
}
运行时,程序没有反应,但是当将上述的线程函数中的AfxMessageBox("主线程已被挂起");这一行去掉,这执行正确。我测试了,hThreadPrimary的值确实是主线程的值,而且suspendthread函数也成功执行
但是在执行AfxMessageBox处就死了。

解决方案 »

  1.   

    下面的代码是"挂起"按钮的触发事件//挂起主线程
    void CSchedLabDlg::OnSuspend() 
    {
    //EnableWindow(0); m_listBox.EnableWindow(0); HANDLE hThreadPrimary;
    DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&hThreadPrimary,THREAD_SUSPEND_RESUME,FALSE,DUPLICATE_SAME_ACCESS);
    DWORD dwThreadID;
    CloseHandle(::CreateThread(NULL,0,ThreadFun,hThreadPrimary,0,&dwThreadID));

    }
      

  2.   

    把AfxMessageBox改成::MessageBox(NULL, "警告", "主线程己挂起", MB_OK);
    就行了。
      

  3.   

    MFC会生成一些线程相关的数据,新建立的线程如果没有初始化这些数据就调用MFC代码可能会出现错误。
      

  4.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfcnotes_tn058.asp
      

  5.   

    如果解决了就给分,怎么解释自己去找答案。我的答案没有经过任何验证,只是我的想法。AfxMessageBox没有HWND或是CWnd类型的参数,我想他的这个值一定设置成了AfxGetMainWnd的值。即主窗口的句柄,而这时候主窗口的线程,即主线程己经挂起,当然不会弹出对话框。因些程序也就不能继续运行。