我的小程序生成了两个主要的类:应用类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:
...
}高手帮忙,怎么回事呀?????
{
...
...
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:
...
}高手帮忙,怎么回事呀?????
InsertItem其实是发一个消息给窗口进行处理。
//框上的一个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,自定义一个无模式对话框来代替。
问题出在这一句上:CTestDlg* this1=(CTestDlg*)(::AfxGetApp()->m_pMainWnd);
这里里面把对话框参数传递进去
CWinThread *t1=::AfxBeginThread(thread1,this,...,...); //创建一个workthread
UINT thread1(LPVOID pParam) //全局函数
{
...
...
CTestDlg* this1=(CTestDlg*)pParam;//获得主对话框
//指针this1;
我曾看过一个帖子,说在创建线程时传递的指针很有学问,MFC中的句柄有时候是临时创建的。所以导致在工作线程中使用它时,出现句柄无效的现像,具体的解法我不太清楚该怎么干。