MFC教程(9)-- MFC的进程和线程(2)

来源: 作者: 2007-12-14 出处:pcdog.com

adsl  ssl  多线程  
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 

  只能访问本线程MFC对象的原因

  MFC规定:

  不能从一个非MFC线程创建和访问MFC对象

  如果一个线程被创建时没有用到CWinThread对象,比如,直接使用“C”的_beginthread或者_beginthreadex创建的线程,则该线程不能访问MFC对象;换句话说,只有通过CWinThread创建MFC线程对象和Win32线程,才可能在创建的线程中使用MFC对象。

  一个线程仅仅能访问它所创建的MFC对象

  这两个规定的原因是:

  为了防止多个线程并发地访问同一个MFC对象,MFC对象和Windows对象之间有一个一一对应的关系,这种关系以映射的形式保存在创建线程的当前模块的模块-线程状态信息中。当一个线程使用某个MFC对象指针P时,ASSERT_VALID(P)将验证当前线程的当前模块是否有Windows句柄和P对应,即是否创建了P所指的Windows对象,验证失败导致ASSERT断言中断程序的执行。如果一个线程要使用其他线程的Windows对象,则必须传递Windows对象句柄,不能传递MFC对象指针。

  当然一般来说,MFC应用程序仅仅在Debug版本下才检查这种映射关系,所以访问其他线程的MFC对象的程序在Realease版本下表面上不会有问题,但是MFC对象被并发访问的后果是不可预见的。

  实现MFC对象和Windows对象之间的映射

  MFC提供了几个函数完成MFC对象和Windows对象之间的映射或者解除这种映射关系,以及从MFC对象得到Windows对象或者从Windows对象得到或创建相应的MFC对象。

  每一个MFC对象类都有成员函数Attach和Detach,FromHandle和FromHandlePermanent,AssertValid。这些成员函数的形式如下:

  Attach(HANDLE Windows_Object_Handle)

  例如:CWnd类的是Attach(HANLDE hWnd),CDC类的是Attach(HDC hDc)。

  Attach用来把一个句柄永久性(Perment)地映射到一个MFC对象上:它把一个Windows对象捆绑(Attach)到一个MFC对象上,MFC对象的句柄成员变量赋值为Windows对象句柄,该MFC对象应该已经存在,但是句柄成员变量为空。

  Detach()

  Detach用来取消Windows对象到MFC对象的永久性映射。如果该Windows对象有一个临时的映射存在,则Detach不理会它。MFC让线程的Idle清除临时映射和临时MFC对象。

  FromHandle(HANDLE Windows_Object)

  它是一个静态成员函数。如果该Windows对象没有映射到一个MFC对象,FromHandle则创建一个临时的MFC对象,并把Windows对象映射到临时的MFC对象上,然后返回临时MFC对象。


更多内容请看PCdog.com--Fireworks教程  PPT教程  电脑入门教程专题
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 
上一篇:MFC教程(10)-- 内存分配方式和调试机制
下一篇:MFC教程(9)-- MFC的进程和线程(1)