- 3
- 0
- 约1.75万字
- 约 13页
- 2021-10-19 发布于福建
- 举报
MFC 多线程编程注意事项( 1)发表日期: 2010-12-17
1 ,表现——错误示例
关于启动线程时传输窗口对象 ( 指针 ?句柄 ?) 的问题:
在选择菜单中的开始线程后:
void cmainframe::onmenu_start()
{
...
afxbeginthread(mythread, this);
...
}
线程函数如下:
uint mythread(lpvoid pparam)
{
cmainframe* pmainfrm = (cmainframe *)pparam;
...
}
问题一:
这样的代码是不是有问题 ?
( 文档中说线程间不能直接传输 mfc 对象的指针,应该通过传输句柄实现 )
问题二:
这样使用开始好像没有问题,直接通过 pmainfrm 访问窗口中的 view 都正常。
但发现访问状态条时:
pmainfrm-m_wndstatusbar.setpanetext(2, test);
出现 debug assertion failed!( 在窗口线程中没有问题 )
位置是 wincore.cpp 中的
assert((p = pmap-lookuppermanent(m_hwnd)) != null ||
(p = pmap-lookuptemporary(m_hwnd)) != null);
为什么访问 view 能正常,但访问状态条时不可以呢 ?
问题三:
如果通过传输句柄实现,怎样做呢 ?
我用下面的代码执行时有问题:
void cmainframe::onmenu_start()
{
...
hwnd hwnd = getsafehwnd();
afxbeginthread(mythread, hwnd);
...
}
uint mythread(lpvoid pparam)
{
cmainframe* pmainfrm = (cmainframe *)(cwnd::fromhandle((hwnd)pparam));
...
}
执行时通过线程中得到 pmainfrm ,访问其成员时不正常。
网友: hewwatt
大致原因解释如下:
1. mfc 的大多数类不是线程安全的, cwnd 及其消息路由是其中之最
2. mfc 界面类的大多数方法,最后都是通过 sendmessage 实现的,而消息处理的过程中
会引发其他消息的发送及处理。如果消息处理函数本身不是线程安全的,你从工作线程中调
用这些方法迟早会同你界面线程的用户消息响应发生冲突
3. cxxxx::fromhandle 会根据调用者所在线程查表,如果查不到用户创建的 cxxxx
对应对象,它会创建一个临时对象出来。由于你在工作线程中调用该方法,当然不可能查到
界面主线程中你所建立起来的那个对象了。这时 mfc 会你创建一个临时对象并返回给你,你
根本不可能期望它的成员变量会是有意义的。 所以要用也只能用 cwnd::fromhandle ,因为
它只包含一个 m_hwnd成员。 不过,要记住跨线程直接或间接地调用 ::sendmessage, 通常都
是行为不可预测的。
2. 原因分析
MFC界面包装类 ( 多线程时成员函数
您可能关注的文档
- Maven工具配置[收集].pdf
- matplotlib函数汇总[整理].pdf
- MAX1718笔记本电脑CPU供电控制芯片[定义].pdf
- Maven的多模块与继承[归纳].pdf
- MAX232芯片介绍[归纳].pdf
- Mayafluideffect流体系统属性详细介绍(二)[归纳].pdf
- MAYA所有的操作命令[参考].pdf
- Maya制作随机飘动的旗帜[汇编].pdf
- MAYA模型生产规范[归纳].pdf
- MBA排列组合解题经典[归类].pdf
- (2026)教师招聘考试题库(附答案).docx
- (2026)教师招聘义务教育道德与法治课程方案(2022版)必考题库及答案.docx
- 2026部编版三年级语文下册全册教案.pdf
- (2026)部编版小学二年级语文下册全册教案.docx
- 高温合金行业研究报告:AI算力与航空航天共振,驱动需求加速释放2026.2.pdf
- 2025年酒店业人工智能(AI)革命研究报告(英).pdf
- 山东省菏泽市郓城县2025-2026学年度第一学期期末教学质量监测八年级英语试题(无答案).pdf
- 内蒙古自治区锡林郭勒盟2026届高三上学期期末测试政治试卷(含答案).pdf
- 贵州省贵阳市南明区2025-2026学年八年级上学期期末地理试题(无答案).pdf
- 山东烟台市栖霞市2025-2026学年八年级上学期期末道德与法治试题(无答案).pdf
原创力文档

文档评论(0)