DoModal、CreateDialogIndirect运行报错误问题

在DoModal中主要对窗体包含的类做初始化,但这个部分的代码是属于MFC内部封装的,

大部分人会感到措手不及,甚至疑问是否MFC框架出现BUG,不可否认MFC存在一些缺点,

但缺点并不是BUG,关于这个地方会报错,调进去后可发现大部分是非法引用句柄、控件变量、资源等等,

但由于工程编译没问题,只在运行时报错,因此可能排错比较麻烦,经调试,

有以下几类原因:

1)由于窗体原来的某个组件删掉了,相应的资源也没了,但相关的变量却没有删除,导致程序运行时引用的变量无非找不到资源而报错。

2)同样是某个组件删掉了,但在一些手动代码中引用资源号而报错。

3)使用原生API创建多线程CreateThread,并在子线程中引用主线程的窗体资源,MFC需要使用窗体线程类来实现多线程操作。

这里说明一下,多线程是一个连具有几十年的开发操作系统经验的工程师都需要不断学习的知识点,

每一个开发框架都会提供一个类似BeginThread的函数,该函数对系统多线程API进行封装,同时设置框架内部的一些系统变量,

这些系统变量会影响内存管理器的工作模式,如果直接使用CreateThread,框架就没有这些功能,会导致使用的框架不是多线程模

式的,最终导致即使两个在地址上相差很“远”的全局变量都会互相影响,不管是MFC还是delphi的VCL,都一样,这是内存管理器

实现时的一个折中方案,需要通过BeginThread来避免,当然BeginThread是较低层的函数,而面向对象的框架都一般会提供一

系列的线程类供不同场景使用。

posted on 2010-07-14 15:14  峋山隐修会  阅读(532)  评论(0编辑  收藏  举报

导航