MFC对象与WIN32句柄的映射-TLS
程序员文章站
2022-04-29 15:21:48
...
1、没有办法把一个MFC某线程交到另一个线程,不能在线程间传递MFC对象指针,包括常用的MFC对象如CWND、CDC、CFONT等。
2、如果两个线程都调用CWND::GETDLGITEM()以取得对话框中的一个控件(如EDIT),则每个线程获得不同的指针,当对此指针的一个索求行为出现时,MFC产生出一些临时性对象,这些对象若被许多线程共享,MFC没有能力预期它们的生命。
3、这个限制是说,你不能放一个指针到结构中,而该结构被一个WORKER线程使用,你不能把一个指向CDIALOG或CVIEW的指针交给另一个线程
4、TLS的使用说明了以AFXBEGINTHREAD()在MFC程序中产生UI线程的重要性,在线程间共享对象,有个替代方案,不要放置MFC对象,放对象的HANDLE,可以利用GETSAFEHANLE获得对象的安全HANDLE,还可以用GETSAFEHWND()。
5、当你把HANDLE给新线程时,线程可以把该HANDLE附着到一个新的MFC对象:使用FROMHANDLE产生一个临时对象,使用ATTACH()产生一个永久对象。
6、MFC同步控制类如LOCK()和UNLOCK()
7、对于MSGWAITFORMULTIPLEOBJECTS()的支持,MFC自己运行消息循环,如何解决呢?
(1)产生另一个线程用来等待,当对象被激发时即送出一个消息给主线程。
(2)改写MFC消息循环,它存在于CWINTHREAD::RUN()和CWINTHREAD::PUMPMESSAGE()中
推荐阅读