对于很多人来说,VC开发Windows界面程序,一般都基于MFC界面库,当前MFC并非windows下唯一的VC界面库,但由于历史原因,其使用者绝对是最多的。我们不对MFC库进行研究,仅仅是研究下windows中线程、界面、消息直接的关系。
线程是什么?线程就是一个执行流,它可以被CPU调度执行。被CPU调度执行,更准确应该说是被操作系统调度,因为计算机硬件系统只是触发一个中断,而具体中断后如何处理,是操作系统底层的处理,而时间片的中断一般触发了操作系统进程切换,所以应该说是被操作系统调度。
那通过上边对进程调度的简单描述,可以发现,进程、线程这些被操作系统调度的执行流,本质上也是数据,包含有代码数据、数据数据、寄存器数据。如果我们完全清楚Windows的存储机制,内存数据含义,理论上来说,我们可以直接修改内存而让系统产生一个进程,只是实际工作来说太复杂。
当然,上边的叙述中有些模糊的地方,例如多次一起提到进程、线程,但本质上来说,进程进程只是一组线程的一个载体,更像一个集合的含义,感觉上有点类似家与人的关系,一个家至少有一个人,每个人是独立的个体,并且大家有联系,属于一个家庭,可以使用家里的所有资源。
这样来看,进程中实际的执行体是线程,以前说进程堆栈,本质上指线程堆栈,每个线程有自己独立的堆栈。以上内容比较容易理解,操作系统类似课程讲的也比较多了。
那下一个概念,在windows中什么是消息?
我认为这一部分内容很生硬,最主要的原因是很多东西只能看文档说明,而不好用实践来证明,不过我们尽量努力把它弄清楚。
了解这里的前提,先建立一个win32项目,也就是windows应用程序项目,千万别建MFC项目。建立完成后,可以看到里边最为核心的一段代码,
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
它用于从消息队列中获取消息,然后处理消息。
这里就涉及三个问题:
1、 消息队列在哪里?
2、 消息从哪里来?
3、 消息对应的事