请问一下VC6里关于mfc对话框的多线程问题

triace_zhang 2006-12-15 01:21:58
用vc6建一个基于mfc对话框的项目,对话框类ThreadTestDlg.加上一个CEdit和CButton控件,在ThreadTestDlg里加一个int成员 m_iCurrInt保存数据,BOOL m_bStart;显示按键状态.按照msdn里的例子建立全局线程函数,把调用对话框作为参数传入.目的是在按下按钮后执行线程,隔一秒对m_iCurrInt++,实时显示在edit上.再次按下按钮后停止线程.

问题是,如果我在线程函数里对传入的ThreadTestDlg参数调用UpdataData()函数程序就出runtime错.如果注释掉UpdateData(FALSE),可以停止线程,结果显示也正确.但是我想要在对话框上调用UpdateData()使edit显示实时效果,请教一下该怎么做.

UINT MyThreadProc( LPVOID pParam ) //作成类函数编译不过
{
CThreadTestDlg* pDlg = (CThreadTestDlg*)pParam;

if (pDlg == NULL)
return 1; // if pObject is not valid

while ( pDlg->m_bStart ) //判断线程是否结束
{
CString sText;
sText.Format( "No. %d", pDlg->m_iCurrInt++ );
pDlg->m_Edit_String = sText; //edit显示
// pDlg->UpdateData(FALSE); //不注释运行出错
Sleep( 1000 );
}


return 0; // thread completed successfully
}

按键响应函数调用线程函数:
void CThreadTestDlg::OnBUTTONThread()
{
// TODO: Add your control notification handler code here
CThreadTestDlg *pDlg = this; //传入对话框
if ( !m_bStart )
{
m_bStart = TRUE;
m_Button_Thread.SetWindowText( "Stop" );//改变按钮显示
AfxBeginThread(MyThreadProc, pDlg); //调用线程
}
else
{
m_bStart = FALSE; //设置状态
m_Button_Thread.SetWindowText( "Start" );
UpdateData( FALSE );
}
}
...全文
310 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
发消息,让主线程来做
DentistryDoctor 2006-12-15
  • 打赏
  • 举报
回复
对,MFC的很多类都不是线程安全的。
由主线程来完成这些工作。
zcp126 2006-12-15
  • 打赏
  • 举报
回复
直接发消息,在线程中不用pdlg->m_iCurrInt,在主线程中
让m_iInt++,在updateData,不用锁了。
zcp126 2006-12-15
  • 打赏
  • 举报
回复
mfc不是县城安全的,updatedata就是。
用消息吧,想主县城发消息,主现成的该消息中用UpdateData();
m_iCurrInt要全局的或static,并且用lock来互斥使用,
Jarrylogin 2006-12-15
  • 打赏
  • 举报
回复
//pDlg->UpdateData(FALSE);
改为pDlg->PostMessage(WM_PAINT, NULL, NULL);
superarhow 2006-12-15
  • 打赏
  • 举报
回复
// pDlg->UpdateData(FALSE); //不注释运行出错
改为pDlg->SendMessage(WM_USER + 1, 0, 0);

然后在Dlg类中响应这个WM_USER+1消息,执行一句UpdateData(FALSE)即可

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧