MFC多线程编程注意事项
来源:互联网 发布:linux停止mysql服务 编辑:程序博客网 时间:2024/05/16 15:57
1.工作线程给主线程发消息使用的是SendMessage和PoseMessage函数。这两个函数的区别在于SendMessage函数是阻塞方式,而PoseMessage函数是非阻塞方式。如果不是严格要求工作线程与主线程必须同步执行,则推荐使用PoseMessage。
2.不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创建的MFC对象,会带来意想不到的问题。更不要在线程函数里,直接调用UpdataData()函数更新用户界面,这会导致程序直接crash。而应该通过发送消息给主线程的方式,在主线程的消息响应函数里操作控件。
3.在主线程中不要使用WaitForSingleObject和WaitForMultipleObjects两个函数等待线程退出,其原因就是有导致程序死锁的隐患,特别是线程函数里调用了SendMessage或是直接操作了MFC对象,更易出现此种现象。为解决这一问题,微软特提供了一个函数,MsgWaitForMultipleObjects。
照着网上的例子,写了在主线程中等待单个线程退出的程序:
DWORD dRet=-2;
MSG msg;
BOOL bWaitAll=FALSE;
int nWaitCount=2; //初始等待的线程数目
while (1)
{
dRet=MsgWaitForMultipleObjects(1,句柄的指 针,bWaitAll,INFINITE,QS_ALLINPUT);
if (dRet == WAIT_OBJECT_0 + 1)
{
TRACE("收到消息,函数返回值为%d /n",dRet);
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if (dRet == WAIT_OBJECT_0 )
{
TRACE("线程退出了/n");
break;
}
}//end while
}
实际使用中,在主线程中使用WaitForMultipleObjects导致界面线程在子线程结束前失去响应,而使用MsgWaitForMultipleObjects则很好的解决了这个问题。
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项
- MFC多线程编程注意事项 (转)
- (转载)MFC多线程编程注意事项
- Windows多线程编程注意事项
- 多线程编程注意事项
- 多线程编程的注意事项
- 商业智能2.0:BI潜力转变为企业行动力
- JSTL常用标准标签库
- 我的卅年
- 选择适合自己的CRM
- 修改SQL Server 某个表中的一列大小写是否敏感
- MFC多线程编程注意事项
- GSM模块使用文档(短信息部分)
- Emacs
- 编译easymule 1.1.5
- 将midas.dll编译到程序中,避免Midas.dll与程序一起发布
- 取出文件夹及其所有子文件夹中所有文件的方法
- 自己改的AT89S51单片机控制GSM模块(M22)发送短信程序,在Keil上编译没错,但还未试过烧入片内运行。。
- 控制发送SMS信息的C51程序[GSM模块(M22)通过串口与单片机相连]
- 详细分析:软件测试的14种类型