mfc界面包装类
经常在论坛上看到如下的问题: 【程序编程相关:VC++中进程与多进程管理的方法 】
——多线程时成员函数调用的断言失败 【推荐阅读:VC下通过系统快照实现进程管理 】
{ 【扩展信息: WMI使用说明(翻译) 】dword winapi threadproc( void *pdata ) // 线程函数(比如用于从com口获取数据) // 数据获取循环 // 数据获得后放在变量i中 cabcdialog *pdialog = reinterpret_cast< cabcdialog* >( pdata ); assert( pdialog ); // 此处如果assert_valid( pdialog )将断言失败 pdialog->m_data = i; pdialog->updatedata( false ); // updatedata内部assert_valid( this )断言失败 …}bool cabcdialog::oninitdialog(){ cdialog::oninitdialog(); // 其他初始化代码 createthread( null, 0, threadproc, this, 0, null ); // 创建线程 return true;} 注意上面注释中的两处断言失败,本文从mfc底层的实现来解释为什么会断言失败,并说明mfc为什么要这样实现及相应的处理办法. 在说明mfc界面包装类的底层实现之前,由于其与窗口有关,故先讲解窗口类这个基础知识以为后面做铺垫. 窗口类窗口类是一个结构,其一个实例代表着一个窗口类型,与c++中的类的概念非常相近(虽然其表现形式完全不同,c++的类只不过是内存布局与其上的操作这个概念的类型),故被称作为窗口类.
窗口是具有设备操作能力的逻辑概念,即一种能操作设备(通常是显示器)的东西.由于窗口是窗口类的实例,就象c++中的一个类的实例,是可以具有成员函数的(虽然表现形式不同),但一定要明确窗口的目的——操作设备(这点也可以从microsoft针对窗口所制订的api的功能看出,主要出于对设备操作的方便).因此不应因为其具有成员函数的功能而将窗口用于功能对象的创建,这虽然不错,但是严重违反了语义的需要(关于语义,可参考我的另一篇文章——«语义的需要»),是不提倡的,但却由于mfc界面包装类的加入导致大多数程序员经常将逻辑混入界面. 窗口类是个结构,其中的大部分成员都没什么重要意义,只是microsoft一相情愿制订的,如果不想使用界面api(windows user interface api),可以不管那些成员.其中只有一个成员是重要的——lpfnwndproc,消息处理函数.... 下一页