Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1035217
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:24:18

4        -线程状的作用

由模-线程状态类的定可知,一个模-线程状包含了几Windows—MFC象的映射。下面讨论的作用。

1)      只能访问线MFC象的原因

 MFC定:

1)不能从一个非MFC线建和访问MFC

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

2)一个线仅仅访问它所建的MFC

 两个定的原因是:

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

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

2)      实现MFC象和Windows象之的映射

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

一个MFC都有成函数AttachDetachFromHandleFromHandlePermanentAssertValid些成函数的形式如下:

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象。

FromHandlePermanent(HANDLE Windows_Object)

它是一个静函数。如果Windows象没有永久地映射到一个MFC象上,返回NULL,否返回对应MFC象。

AssertValid()

 它是从CObject类继承来的虚函数。MFC覆盖函数,实现了至少一个功能:判断当前MFC象的指this是否映射到一个对应的可靠的Windows象。

9-9示意了MFC映射构的实现层次,对图9-9如下。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

中上面的虚线框表示使用映射系的高层调用,包括上面述的几函数。MFC用程序通们创建、销毁、使用映射系。

中中的虚线框表示MFC使用CHandleMap类实现对映射系的管理。一个CHandleMap象可以通两个成员变量来管理两映射数据:临时映射和永久映射。模-线程状态给每MFC象分派一个CHandleMap象来管理其映射数据(-线的定),例如m_pmapHWND所指象用来保存CWnd象(或派生类对象)和Windows window的映射。

下面的虚线框表示映射系的最底层实现MFC使用通用CMapPtrToPtr来管理MFC象指Windows句柄之的映射数据。

节总结如下:

1)      MFC的映射数据保存在模-线程状中,是线程和模局部的。线程管理自己映射的数据,其他线程不能访问到本线程的映射数据,也就不允使用本线程的MFC象。

 

2)      一个MFCCWndCDC等)负责创建或者管理这类线-对应CHandleMap类对象。例如,CWnd::Attach建一个永久性的映射保存在m_pmapHwnd所指象中,如果m_pmapHand没有建,使用AfxMapHWND建相CHandleMap象。

3)      映射分两:永久性的或者临时的。

 

 

阅读(1302) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~