admin管理员组

文章数量:1566992

2024年5月18日发(作者:)

从SetTimer看Windows消息处理机制

2010-02-09 22:07 909人阅读 评论(0) 收藏 举报

本文说明两个问题:s的消息处理机制;2.怎么往SetTimer的回调函数传

递参数。首先看第一个问题,我们都知道 windows是消 息驱动的,windows呈现给用

户的任何可以看到听到的东西几乎都是消息驱动的,在底层windows为每个线程准备了

一个消息队列,如果用户线程注册 了某个消息,那么在适当的时候windows就会将消息

投递到该线程的消息队列中,然后由该线程取出队列中的消息,然后处理之,这个过程有

两个参与者,一 个是windows系统,它主要负责投递消息,收不收是用户线程的事,另

一个就是用户线程,它主要负责取出消息并处理消息,即使用户线程因为睡眠或者根本 就

没有设定消息循环,系统还是会投递的,系统和用户线程的消息接口就是消息队列,这就

在用户和系统之间关于消息解除了耦合,在用户线程处理消息的时候,其 实还有一个消息

队列,因为一个线程不一定只接收一种消息而且不一定马上就能处理完并返回,这个消息

队列我们把它叫做消息分发队列或者简称分发队列用来与系 统的消息队列区分,注意分发

队列里面的消息都是已经格式化后的消息,分发给谁呢?当然是分发给消息的回调函数了,

对于有窗口的就是先分发给窗口过程,然后 由窗口过程分发给具体的处理函数。

下面我们来通过一个例子说明一下,用vs2005或VC建立一个Win32工程,然后看

自动生成的代码:

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

...

// 主消息循环:

while (GetMessage(&msg, NULL, 0, 0))

{

if (!TranslateAccelerator(, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);//msg中按照消息号识别

}

}

本文标签: 消息线程队列用户处理