没有合适的资源?快使用搜索试试~ 我知道了~
mfc 多线程使用全局变量应注意
5星 · 超过95%的资源 需积分: 45 131 下载量 50 浏览量
2011-11-03
10:28:50
上传
评论 3
收藏 31KB DOC 举报
温馨提示
试读
4页
一、使用消息传递参数 二、线程安全的概念和条件 三、多线程设计应注意事项
资源推荐
资源详情
资源评论
之所以是“可能”,因为这里有个重点就是临时对象是 HWND 操作的封装,不是窗口类的封
装。因此所有的
HWND 临时对象都是 CWnd 的实例,即使上面强行转换为 CAbcDialog*也依旧是 CWnd*,
所以在 ASSERT_VALID 里
调用 CAbcDialog::AssertValid 时,其定义了一些附加检查,则可能发现这是一个 CWnd 的
实例而非一个
CAbcDialog 实例,导致断言失败。因此应将 CAbcDialog 全部换成 CWnd,这下虽然不断言
失败了,但依旧错
误(先不提 pDialog->m_Data 怎么办),因为临时对象是 HWND 操作的封装,而不幸的是
UpdateData 只是 MFC
自己提供的一个对话框数据交换的机制(DDX)的操作,其不是通过向 HWND 发送消息
来实现的,而是通过
虚 函 数 机 制 。 因 此 在 UpdateData 中 调 用 实 例 的 DoDataExchange 将 不 能 调 用
CAbcDialog::DoDataExchange,
而是调用 CWnd::DoDataExchange,因此将不发生任何事。
一、
因此合理(并不一定最好)的解决方法是向 CAbcDialog 的实例发送一个消息,而通过一个
中间变量(如一
全局变量)来传递数据,而不是使用 CAbcDialog::m_Data。当然,如果数据少,比如本例,
就应该将数据
作为消息参数进行传递,减少代码的复杂性;数据多则应该通过全局变量传递,减少了缓
冲的管理费用。
修改后如下:
#define AM_DATANOTIFY ( WM_USER + 1 )
static DWORD g_Data = 0;
DWORD WINAPI ThreadProc( void *pData ) // 线程函数(比如用于从 COM 口获取数
据)
{
// 数据获取循环
// 数据获得后放在变量 i 中
g_Data = i;
CWnd *pWnd = CWnd::FromHandle( reinterpret_cast< HWND >( pData ) );
ASSERT_VALID( pWnd ); // 本例应该直接调用平台 SendMessage 而不调用包装类的,
JINGRH
- 粉丝: 30
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页