【多线程与AfxGetMainWnd & 窗口 与 线程 有必然联系吗? & 命名空间】

本文详细介绍了在多线程环境下使用AfxGetMainWnd函数获取窗口句柄的问题及解决方案,通过全局窗口句柄类变量避免了崩溃情况,并解释了多线程里获得的句柄不等于真正的窗体句柄的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


【多线程与AfxGetMainWnd & 窗口 与 线程 有必然联系吗? &  命名空间】

笔记内容:

转载自:http://blog.youkuaiyun.com/linyaoxin/article/details/4847529

《多线程与AfxGetMainWnd的吐血遭遇……》

事情开始有点眉目了,似乎是开始多线程以后再调用::AfxGetMainWnd()->SetWindowText就会发生崩溃,但是为啥之前VC6里死活没问题?找了半天资料没答案,最后很幸运的在某个站点看到一个全英文回答:

If AfxGetMainWnd is called from the application's primary thread, itreturns the application's main window according to the above rules. If thefunction is called from a secondary thread in the application, the functionreturns the main window associated with the thread that made the call.

在多线程里调用AfxGetMainWnd返回的是与线程有关联的主窗体?但是我这程序只有一个窗体,但是它仍然崩溃,差不多明白了,多线程里获得的句柄不等于真正的窗体句柄,对这个句柄进行“非法写操作”,于是崩溃了……

 

// "多线程里获得的句柄不等于真正的窗体句柄",这句话不理解?

// 有多个窗口,多个线程,此时,各个线程中调用 AfxGetMainWnd() 返回的是什么呢? 

// 有一个窗口,多个线程,此时,各个线程中调用 AfxGetMainWnd() 返回的又是什么呢? Trylater。

// 窗口 与 线程 有必然联系吗?

 

了解了症状就好办了,在全局里写一个窗口句柄类变量
CWnd* m_pCWnd;

然后在初始化过程OnInitDialog里加上
m_pCWnd = AfxGetMainWnd();

// 这里为什么不用命名空间限定符,即 m_pCWnd = ::AfxGetMainWnd();

以后要写窗体标题的时候就用m_pCWnd->SetWindowText,将程序里所有AfxGetMainWnd改为m_pCWnd,重新编译运行,终于不再崩溃了!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值