框架程序的状态信息
对于应用程序来说,有许多的状态需要维护:如模块状态、线程状态等。
模块的概念:每一个被加载到内存中的文件成为一个模块。一般进程是由多个模块组成的,通常应用程序都是通过模块句柄来访问进
程中的模块。事实上,模块的句柄的值就是该模块映射到进程中的地址。
模块 - 线程状态:AFX_MODULE_THREAD_STATE
模块状态: AFX_MODULE_STATE
线程状态:_AFX_THREAD_STATE
维护模块的状态是为了在程序运行过程中方便查询,所以每当模块被加载到内存,执行初始化代码的时候,就应当为这个模块申请一
个 AFX_MODULE_STATE对象,并设置其成员值。为了保存正在执行的模块的AFX_MODULE_STATE指针,我们要再定义线程状态
_AFX_THREAD_STATE,用于保存线程的状态信息。
同样,每创建一个线程就创建一个新的 _AFX_THREAD_STATE对象。
框架程序的执行顺序
线程经历的状态:
1. Initialize Instance : 执行线程实例的初始化工作
2. Running: 进入消息循环
3. Exit Instance: 线程终止时执行清除
Initialize Instance、Run和 Exit Instance函数是由框架程序负责调用的,用户如果想添加额外的代码只需重载它们就可以了。
线程刚看时被创建时,必须做一些初始化工作,为的是产生应用程序的工作平台----窗口。这项工作是每个线程实例都必须做的,所以
称之为Initialize Instance。
程序的初始化过程:
在使用框架程序之前,用户必须首先创建应用程序实例,这个应用程序实例用来初始化整个类库框架,也用来维护一些全局变量信息。我们用一个CWinAPP类来描述它。
注意:此框架规定,每个应用程序必须有一个全局的CWinApp对象,这样CWinApp类的构造函数就会在WinMain函数执行之前被调
用。CWinApp的构造函数除了初始化CWinApp对象之外,还初始化了主线程的线程状态和当前模块的模块状态。
一个很关键的函数:
BOOL AfxWinInit(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);它负责类库框架的内部
初始化。
使用类库框架之后,不需要再与WinMain函数见面了,只需从CWinApp类派生自己的应用程序类,重载InitApplication 或者
InitInstance函数。如果想让程序进入消息循环,就令InitInstance函数返回TRUE,否则返回FALSE。
InitInstance:负责每个线程只做一次的动作,
InitApplication:负责每个程序只做一次的动作。