(MFC编程)线程函数调用UpdateData崩溃
线程函数定义如下(声明略):其中m_print_msg是输入框对应的变量UINTmyThreadFunc(LPVOIDlparam){Cclient_mfcDlg*Dlg...
线程函数定义如下(声明略):其中m_print_msg是输入框对应的变量
UINT myThreadFunc(LPVOID lparam){
Cclient_mfcDlg *DlgPtr=(Cclient_mfcDlg*)lparam;
DlgPtr->UpdateData(true);//如果用线程,这句会崩
DlgPtr->m_print_msg+="1";//这句不会崩
DlgPtr->UpdateData(false);//如果用线程,这句会崩
return 0;
}
这是开启线程的部分:只要一点按钮OK就会崩溃
void CxxxDlg::OnBnClickedOk()
{
...
AfxBeginThread(myThreadFunc,(LPVOID)this,0,0,0,0);//会崩溃,显示Debug Assertion Failed错误(这很笼统,没有说明是什么问题)
//myThreadFunc(this);//如果不用线程,而是像这样直接调用函数不会崩溃,能达到效果,显示出“1”
}
注:1.这个程序必须用多线程,因为以后线程里要加上网络通信的代码,这里只是简化的版本
2.尽量不发消息;如果必须要,请注明具体方法 展开
UINT myThreadFunc(LPVOID lparam){
Cclient_mfcDlg *DlgPtr=(Cclient_mfcDlg*)lparam;
DlgPtr->UpdateData(true);//如果用线程,这句会崩
DlgPtr->m_print_msg+="1";//这句不会崩
DlgPtr->UpdateData(false);//如果用线程,这句会崩
return 0;
}
这是开启线程的部分:只要一点按钮OK就会崩溃
void CxxxDlg::OnBnClickedOk()
{
...
AfxBeginThread(myThreadFunc,(LPVOID)this,0,0,0,0);//会崩溃,显示Debug Assertion Failed错误(这很笼统,没有说明是什么问题)
//myThreadFunc(this);//如果不用线程,而是像这样直接调用函数不会崩溃,能达到效果,显示出“1”
}
注:1.这个程序必须用多线程,因为以后线程里要加上网络通信的代码,这里只是简化的版本
2.尽量不发消息;如果必须要,请注明具体方法 展开
展开全部
我的经验,我定义了一个结构,在结构里面定义对话框指针,对话框指针赋值给结构变量里面的对话框指针,然后把结构指针传递给myThreadFunc函数,这样就可以在线程理使用。
更多追问追答
追问
我的程序里:
Cclient_mfcDlg *DlgPtr=(Cclient_mfcDlg*)lparam;
DlgPtr->UpdateData(true);
这样做是不是跟你说的一样呢?还是崩溃啊……
追答
我好像这样做过,好像不行,试一试把this指针强制转换为相应的对话框指针后再传进来试一试。
我还碰到一种奇怪的现象,就是DlgPtr->UpdateData(true);开始调用没有问题,但运行一段时间后会崩溃掉,不知什么原因,后来改成一个结构,通过结构传进结构变量指针后就没有问题。
结构如下:
typedef struct tagINFO {
CListBox *pListBox2;
CStatic *pStatic;
CString *pStringCode1;
CDlg6Dlg *pMyFindDlg;//对话框指针
} INFO;//用于传递参数给工作者线程
创建线程处代码
INFO *info=new INFO;//用new建立才能正确传输参数
if( info == 0 )
{
MessageBox(_T("内存不足,查找失败!"),NULL,MB_OK);
return ;
}
info->pMyFindDlg=this;//把对话框指针赋值给结构变量对话框指针
INFO *pNewObject =info;
AfxBeginThread(MyThreadProc, pNewObject);//创建并运行线程
线程里面
INFO* pObject = (INFO*)pParam;
调用对话框的地方:
pObject->pMyFindDlg->m_Edit_FindDirPrompt.SetWindowText(FilePath);//在编辑框中显示正
//在查找文件的路径
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询