继续总结CWinThread实现多线程的问题

本文详细讨论了CWinThread实现多线程时遇到的问题,包括线程退出机制、智能指针与线程生命周期管理、m_bAutoDelete属性的影响、InitInstance的返回值、Sleep函数的使用、线程句柄的关闭以及线程初始化的同步。提出了相应的解决方案,如确保主线程OnClose时子线程安全退出,正确管理线程对象的生命周期,以及避免创建线程时的断言失败等。
摘要由CSDN通过智能技术生成

1.CWinThread的继承类实现的多线程或者AfxBeginThread()创建的用户界面线程,在结束的时候通过WM_QUIT消息退出消息循环,这样就要求在线程退出时消息循环仍然不能出错,而对于没有显式设定主窗口的子线程默认会将主线程的主窗口(CMainFrame)设定为自己的主窗口,因此要求子线程在退出时主窗口仍然有效(因为在消息循环中有断言ASSERT(::IsWindow(m_pMainWnd))存在,主窗口失效触发断言失败。)因此需要所有用户界面线程类型的子线程在主线程的OnClose()中进行退出.


2.由于1中叙述的原因,把CWinThread的继承类对象用智能指针进行包装,并在智能指针释放(析构函数)中等待线程退出的情况下,要确保智能指针在主窗口的OnClose结束前进行释放(即子线程退出)。如果这样的智能指针作为一个单例模式对象的成员变量,这时要注意这个单例模式的对象要在OnClose结束前释放。因此这个单例要是可控制自己Release时机的,所以不能使用局部静态变量方法实现的单例模式(应该使用指针成员变量方法实现的单例模式。)


3.如果CWinThread类或其继承类设定m_bAutoDelete为FALSE,则线程对象不会被删除,可以实现多次利用这个线程对象。但这样要注意这个线程对象的下一次启动调用CWinThread::CreateThread时由于对象已经被创建(成员变量m_hThread句柄不再为NULL)而造成断言ENSURE(m_hThread == NULL)失败。解决方法是在等待线程退出的时候应该关闭句柄&#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值