MFC 对象访问

从多线程访问对象

由于大小和性能原因,MFC 对象在对象级别不是线程安全的,而只是在类级别线程安全。这表明可以有两个独立的线程操作两个不同的 CString 对象,但不能有两个线程操作同一个 CString 对象。如果一定要有多个线程操作同一个对象,请用适当的 Win32 同步机制(如临界区)保护此类访问权。有关临界区和其他相关对象的更多信息,请参见 Platform SDK 中的同步。

类库内部使用临界区以保护全局数据结构,例如调试存储分配使用的结构。

从非 MFC 线程访问 MFC 对象

如果多线程应用程序使用 CWinThread 对象以外的方式创建线程,则不能从该线程访问其他 MFC 对象。换句话说,如果要从次要线程访问任何 MFC 对象,则必须用多线程编程:创建用户界面线程多线程编程:创建辅助线程文章中所述的方法之一创建该线程。只有这些方法才允许类库初始化处理多线程应用程序所需的内部变量。

Windows 句柄映射

作为通用规则,线程只能访问它创建的 MFC 对象。这是因为临时和永久性 Windows 句柄映射保留在线程本地存储中,以对它进行保护,确保不能有多个线程同时访问它。例如,辅助线程不能执行计算并调用文档的 UpdateAllViews 成员函数来修改包含新数据视图的窗口。此操作将不会有任何效果,因为从 CWnd 对象到 HWND 的映射是主线程的本地映射。这意味着一个线程可能有从 Windows 句柄到 C++ 对象的映射,但是另一个线程可能会将此句柄映射到其他 C++ 对象。在一个线程内所做的更改将不会反映在另一个线程中。

有几种方式可以避免此问题。首先是将各个句柄(如 HWND)而不是 C++ 对象传递到辅助线程。然后,辅助线程通过调用适当 FromHandle 成员函数将这些对象添加到它的临时映射。还可以通过调用 Attach 将对象添加到线程的永久映射,但只有在保证对象比线程存在的时间长时,才应当进行此操作。

另一个方法是创建新的与辅助线程将要执行的不同任务相对应的用户定义消息,并使用 ::PostMessage 将这些消息发布到应用程序的主窗口。此通信方法类似于两个不同的应用程序在对话,只不过这两个线程在同一地址空间中执行。

有关句柄映射的更多信息,请参见技术说明 3。有关线程本地存储的更多信息,请参见 Platform SDK 中的线程本地存储和使用线程本地存储区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值