关于WINDOWS消息列队

原创 2002年05月10日 09:49:00
 

关于WINDOWS消息列队<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

/Bogdan Rechi

引言

每个人都知道MFC是开发WINDOWS平台的应用程序最有用的工具。它的类在开发整个较难的任务时是专家级别的,你能想象得到被选择的解决方案的适应性是多么重要。在开发大型软件时,为了让程序员远离细节之类的问题,这是最好的方式。当处理一个基于WINDOWS的系统时它是最大的优势,但是……

 

线程

我们这里不谈基于WINDOWS的系统。“一个程序内部工作的实体是线程”,这是MSDN中说的。在许多后台细节像“堆栈”和“执行路径”中,它也要覆盖一个消息列队的实行。这不是一个规定,但是你将发现它在每个支持窗口的线程上。这是一个普遍存在的误论:窗口有消息列队。错了!消息列队只对线程存在,并且发送给窗口的消息通过在线程里消息的循环派遣给它。我将在这篇文章里俯上例子来说明这个问题。

 

程序

这是一个基于应用程序的控制台;模态对话框通过控制台的消息列队管理它的消息,所以它不会在同一时间拥有两个列队。代码提供了一个和主函数。

CconsoleQueue

这个类实行一个消息循环和一个处理消息的原始系统。它有下列方法:

RunQueue——运行类的消息循环

while (GetMessage(&msg, NULL, 0, 0))    // extract the message from the queue

{

if

(fctMan=(*this)[msg.message])

fctMan((void *)msg.wParam);   

else

{

TranslateMessage(&msg); // necessary to listen the keyboard

DispatchMessage(&msg);  // message goes to the default procedure

}

}

EndQueue——通过WM_QUIT结束消息循环

PostMessage(NULL, WM_QUIT, 0, 0);     // message to interrupt the loop by returning FALSE //on GetMessage

RegisterMessageHandler——注册一个句柄函数到一个特定的消息。当在消息循环里接收到该消息就呼叫句柄函数。为了传递一个句柄的值,你必须在呼叫PostMessage接通WPARAM

笔记:这个能被考虑作为一个由“能适应的交流环境(Adaptive Communication Environment ACE)”提议的反映堆概念的骨干。

RemoveAll——删除所有的联合(从反映堆里)

 

主函数

函数的计划是一步一步的,像下面:

1.  建立一个模态对话框,用来发送消息到列队:

hWndDialog=CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG_TEST),

 NULL, DialogProcedure);

ShowWindow(hWndDialog, SW_SHOW)

2.  在线程上设置一个计时器

nTimer=SetTimer(NULL, 0, nDelay*1000, TimerProcedure);

3.  为用户定义的消息注册一个句柄

queue.RegisterMessageHandler(WM_USER_DEFINED, UserDefined);

4.  运行列队

queue.RunQueue();

 

行为

目的是在消息列队里结束WM_TIMER消息。每个WM_TIMER将打印到控制台的一个普通缓冲区内。如果缓冲区没有对nKeepQueueSteps WM_TIMER进行修改,最后的一个消息将终止计时器和结束消息列队。修改缓冲区是在模态对话框内通过在编辑框内写入和压入“发送缓冲区”完成了的。压入“发送用户定义的”消息将使WM_USER_DEFINED消息增加到列队里。

 

最后

注意呼叫PostMessageNULL作为第一个参数在当前线程消息列队里结束消息。

另一个注意是关于计时器的设置。这个只在列队事件中存在,并且它不是窗口资源。它属于线程,只是如果它被设置和通过DispatchMessage呼叫时才能影响窗口。

对消息循环的最后一句话。对程序员来说这是缺陷的来源。实际上在单个线程的执行里你可以有更多的消息循环。为了测试一下,简单的增加main实际的内容,可以在函数体中像这样:

hWndDialog=CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG_TEST),

NULL, DialogProcedure);  // ...

cout<<endl<<"program ends here..."<<endl;

hWndDialog=CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG_TEST),

NULL, DialogProcedure);

 // ...

cout<<endl<<"program ends here..."<<endl;

 // ...    

hWndDialog=CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG_TEST),

NULL, DialogProcedure);

// ...

cout<<endl<<"program ends here..."<<endl;

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

 

【NOIP2017提高组正式赛】列队

Description Sylvia 是一个热爱学习的女孩子。 前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候需要站方阵。 Sylvia所在的方阵中有n × m名学生,方阵的...
  • puppywolf
  • puppywolf
  • 2017年11月22日 20:43
  • 346

关于windows消息

大部分消息宏定义在winuser.h里但调试时发现有一个0x0019消息在这里找不到定义费了老大的劲才找到这个消息的定义在windowsX.h原来是WM_CTLCOLOR...顺便发现windowsX...
  • xjy1204
  • xjy1204
  • 2011年01月07日 10:58
  • 180

windows中使用钩子拦截消息

一、前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动。换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理。处理完此次消息后又回到等待状态。从上面对...
  • zi_wu_xian
  • zi_wu_xian
  • 2013年04月25日 22:21
  • 3484

「NOIP2017」列队 //线段树

题意 有一个n行m列的方阵,第i行j列的点编号为(i-1)m+j。 给出q次操作,每次把第x行y列的点拿出来,然后把这一行它之后的点都向左推,把最后一列x行之后的点都向上推,然后把之前(x,y)的点放...
  • Starria
  • Starria
  • 2017年12月08日 23:08
  • 213

【NOIP2017提高组正式赛】D2T3列队

Sylvia 是一个热爱学习的女孩子。 前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候需要站方阵。 Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为 m。 ...
  • lijf2001
  • lijf2001
  • 2017年11月22日 22:41
  • 220

jzoj5478. 【NOIP2017提高组】列队

题意一个n*m的矩阵,每个位置上有一个编号,每次取出一个编号(a,b),将(a,k) k>b左移一位,(z,m) z>a上移一位。 (左上角1,1),然后将取出的编号放在(n,m). n,m...
  • jokerwyt
  • jokerwyt
  • 2017年11月18日 15:11
  • 417

消息列队机制(个人理解)

消息列队机制
  • qq_26440221
  • qq_26440221
  • 2016年02月28日 22:32
  • 836

NOIP2017 列队 题解报告【56行线段树】

题目描述 Sylvia 是一个热爱学习的女♂孩子。 前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候需要站方阵。 Sylvia 所在的方阵中有n \times mn×m名学生,方...
  • qq_38678604
  • qq_38678604
  • 2017年11月19日 18:10
  • 1076

NOIP2017 Day2_T3 列队

题目大意:众人皆知。题解:考场时打SBT打傻了,被卡爆了。这就是个傻逼线段树能过的东西,不要问我问为什么能跑这么快?每一行用线段树维护前m-1个。最后一列独立开来。查询用线段树二分。可以直接预开6e5...
  • Cold_Chair
  • Cold_Chair
  • 2017年11月18日 16:05
  • 710

优先队列详解+ACM例题分析(转载)

优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 当然优先...
  • qq_38492462
  • qq_38492462
  • 2017年11月25日 12:36
  • 56
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于WINDOWS消息列队
举报原因:
原因补充:

(最多只允许输入30个字)