线程函数问题

描述:
MFC对话框工程,想用一个Edit控件实时显示线程函数中某个变量的实时值。
下面是个Demo代码:

void CThreadTestDlg::OnButton1()//启动线程
{
// TODO: Add your control notification handler code here
DWORD ThreadId;
handleThread=::CreateThread(NULL,0,TestThreadProc,this,0,&ThreadId);
}

void CThreadTestDlg::OnButton2()//关闭线程
{
// TODO: Add your control notification handler code here
TerminateThread(handleThread,0);
}

DWORD WINAPI CThreadTestDlg::TestThreadProc(LPVOID lParam)
{
CThreadTestDlg *mainDlg=(CThreadTestDlg*)lParam;

int iMsg=0;
for (int i=0;i<65536;i++)
{
iMsg++;
mainDlg->OnShowMsg(iMsg);
}

return 0;
}

void CThreadTestDlg::OnShowMsg(int iMsg)
{
m_strMsg.Format("%d",iMsg);//m_strMsg为Edit控件绑定变量
UpdateData(FALSE);
}

UpdateData(FALSE);到这里程序就中断了,希望高手能指点一下。。。
...全文
125 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
看错了,不好意思,本来是想把30分给dahaiI0的
dahaiI0 2012-05-17
  • 打赏
  • 举报
回复
另外关闭线程最好不要TerminateThread,这个比较暴力而且可能会有资源泄漏,常规方法用事件或全局变量开控制,让线程函数自然return结束掉
dahaiI0 2012-05-17
  • 打赏
  • 举报
回复
推荐楼主本书:win32多线程程序设计,PDF到处有下载,这本书上有提到你这种情况
dahaiI0 2012-05-17
  • 打赏
  • 举报
回复
UpdateData这个函数最终是执行在你创建的线程里。这种做法是错误的。
MFC对象不是线程安全的,虽然你传个指针过去,在自己创建的线程里能用,但有些函数只能在创建这个MFC对象的线程里调用,就像你这里的UpdateData,具体崩溃的原因请看这里
http://support.microsoft.com/default.aspx?scid=kb;en-us;147578

一般正规的做法,传主窗口句柄给子线程,然后发送自定义消息给主窗口,让主窗口自己来刷新,这里具体指的是,让主窗口的消息响应函数来调用UpdateData
sumos 2012-05-17
  • 打赏
  • 举报
回复
DWORD WINAPI CThreadTestDlg::TestThreadProc(LPVOID lParam);
线程函数有两种:
1,全局函数:UINT ThreadFun(LPVOID p);
2,静态成员函数:static UINT CThreadTestDlg::TestThreadProc(LPVOID p);
wb_rock 2012-05-17
  • 打赏
  • 举报
回复
不应该在线程里边调用UpdateData(FALSE),等待这个线程跑完了,再调用

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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