在对话框CPP中,启动了一个线程。在线程中有操作对话框的动作。
测试代码:void CTestDlg::OnOK()
{
    DWORD dwThread = 0;
    HANDLE hHandle = CreateThread(NULL,0,MyFun,(LPVOID)this,dwThread);
    if( WAIT_OBJECT_0 == WaitForSingleObject(hHandle,INFINIT) )//这个地方卡住,好像死循环了。
    {
        //继续操作;
    }
}
DWORD WINAPI CTestDlg::MyFun(LPVOID lParam)
{
    //访问对话框资源
    CMyDlg* pDlg = (CMyDlg*)lParam;
    pDlg->m_List.DeleteAllItems();
    //...
    //...
}
在Wait线程的时候就出不来了,一直等待。调试了一下,发现是线程中操作了控件造成的。
请问大家如何解决这个问题?尽量可以让我的线程操作资源,然后正常等待。

解决方案 »

  1.   

    void   CTestDlg::OnOK() 
    HANDLE   hHandle   =   CreateThread(NULL,0,MyFun,(LPVOID)this,dwThread); 
    CMyDlg*   pDlg   =   (CMyDlg*)lParam; 
    不能这么转换的,你传CTestDlg窗口类指针必须转成CTestDlg窗口类指针指针
    CTestDlg*   pDlg   =   (CTestDlg*)lParam; 
      

  2.   

    现在问题是CTestDlg的父窗口调用了CTestDlg的启动线程函数,要等待线程结束。
    如果在线程中发消息出去,改动代码很大。
    如:
    CMyDlg::OnStart()
    {
    m_testDlg.OnOk();
    }
    CTestDlg::OnOk()
    {
    //HdThread是封装好的线程对象
    m_HdThread.StartWork(Work,(LPVOID)this);//Work是线程函数
    m_HdThread.Wait();//等待
    }
      

  3.   

    那你用宏TRACE打印线程的处理过程,看阻塞在什么地方了。
      

  4.   

    线程是停在操作资源的地方
    比如:
    m_List.DeleteAllItems();
    这里就停住了。想这种问题需要用什么方法来解决?
      

  5.   

    给个消息吧,
    比如
    sendMessage(Id)在外面处理
      

  6.   

    m_List.DeleteAllItems(); 会发消息给控件,我想问一下m_List所属的类是怎么样的,是不是继承自MFC的基类。我怀疑是DeleteAllItems里面造成了某个地方死循环了。
      

  7.   

    原因如下:CTestDlg::OnOK() 
    是在响应对话框的ok消息,但是由于组赛,这个消息没有执行完。
    而DeleteAllItems其实也需要想控件发送消息,而且是通过sendmessage,但是由于ok这个消息没有处理完,所以有DeleteAllItems发出的消息就得不到响应,所以DeleteAllItems就不会返回,造成死锁
      

  8.   

    我已经把该线程里对LISTCTRL控件的操作脱离出来了,好像目前只能这样解决。
    好了,结贴给分。