我的小程序生成了两个主要的类:应用类CTestApp 主对话框类CTestDlgUINT thread1(LPVOID pParam)   //全局函数
{
   ...
   ...
   CTestDlg* this1=(CTestDlg*)(::AfxGetApp()->m_pMainWnd);//获得主对话框
                                                          //指针this1;
   this1->mainlistctrl.InsertItem(0,"增加一项",0);//mainlistctrl为主对话
                                                  //框上的一个CListCtrl,
                                                  //向该列表框控件中的0行
                                                  //增加一行,问题出在这
                                                  //里,如果在主线程OnCol
                     //se()中增加MessageBox("任意")语句,一切正常,如果去
                     //掉MessageBox语句,执行到这儿就不往下走了。
   ...
   ...
   return 0;
}void CTestDlg::OnColse()  //关闭程序时调用
{
   CWinThread *t1=::AfxBeginThread(thread1,...,...);  //创建一个workthread
   DWORD exitcode;                      //用来测试刚创建的线程是否已退出
aaa:
   ::Sleep(10);
   if(!::GetExitCodeThread(t1->m_hThread,&exitcode))  //如果不能得到线程
                                                      //的退出码,往下走
   {
      goto bbb:
   }
   if(exitcode==STILL_ACTIVE)    //得到线程退出码后,如果线程没退出,跳
                                 //转到aaa处继续
   {
       MessageBox("奇怪的问题");     //如果有这一句就一切正常,去掉这一
                                      //句thread1就死在往列表框中增加行上
                                      //了
       goto aaa;
    }
bbb:
    ...
}高手帮忙,怎么回事呀?????

解决方案 »

  1.   

    OnMessageBox暂时挂住了主窗体的消息处理。
    InsertItem其实是发一个消息给窗口进行处理。
      

  2.   

    guxingfeiyu(孤星飞雨) 该怎么处理呢!!
      

  3.   

    我在THREAD1中用如下语句:int count=this1->mainlistctrl.GetItemCount();也是走不下去,我个人认为是不能读写那个列表框
      

  4.   

    this1->mainlistctrl.InsertItem(0,"增加一项",0);//mainlistctrl为主对话
                                                      //框上的一个CListCtrl,
                                                      //向该列表框控件中的0行
                                                      //增加一行,问题出在这
                                                      //里,如果在主线程OnCol
                         //se()中增加MessageBox("任意")语句,一切正常,如果去
                         //掉MessageBox语句,执行到这儿就不往下走了。
       ...
    改为:
    自定义一个WM_MYADDITEM消息
    PostMessage(this1->m_hWnd,WM_MYADDITEM,0,<增加一项的字符串,这个字符串可以new 一个新的字符串指针>);
    在PostMessage之后强行TranslateMessage.
    然后再CTestDlg的WindowProc中处理WM_MYADDITEM消息
    执行this1->mainlistctrl.InsertItem后面的所有界面相关的代码还有一种办法就是不调用MessageBox,自定义一个无模式对话框来代替。
      

  5.   

    guxingfeiyu(孤星飞雨) 这样解决了向列表框中增中项的问题,关键是在THREAD1中根本不能对列表框进行任意读写
      

  6.   

    只要在thread1中一用this1,就死了,肯定是this1的值不对,
    问题出在这一句上:CTestDlg* this1=(CTestDlg*)(::AfxGetApp()->m_pMainWnd);
      

  7.   

    CWinThread *t1=::AfxBeginThread(thread1,...,...);  //创建一个workthread
    这里里面把对话框参数传递进去
    CWinThread *t1=::AfxBeginThread(thread1,this,...,...);  //创建一个workthread
      

  8.   

    然后 CTestDlg* this1=(CTestDlg*)lParam;
      

  9.   

    笔误,然后
     UINT thread1(LPVOID pParam)   //全局函数
    {
       ...
       ...
       CTestDlg* this1=(CTestDlg*)pParam;//获得主对话框
                                                              //指针this1;
      

  10.   

    我是头痛死了,用pParam传递过去也不管用,一用this1就死
      

  11.   

    我也常遇到这个问题,至今没有找到好的办法,在工作线程中操作界面线程中的控件,我通常是在工作线程中发消息给界面线程,让界面线程去做。这是最安全的。
      我曾看过一个帖子,说在创建线程时传递的指针很有学问,MFC中的句柄有时候是临时创建的。所以导致在工作线程中使用它时,出现句柄无效的现像,具体的解法我不太清楚该怎么干。