您的位置:首页 > 编程语言 > Java开发

c#消息队列,事件处理(java)

2011-12-16 15:33 405 查看
最近在用C#做一个东西,遇到的情况是在一个button的click事件中循环的激发另一个事件,并且每次都要处理完上一次激发的事件之后再进行下一次的循环,具体请看这个帖子:http://topic.csdn.net/u/20111214/14/5dcc7617-d294-428f-9510-d46edab305de.html ,至今也没有人回复。。。

起初以为是进程间同步的问题,所以使用一个全局变量来实现两个进程间的同步,结果程序死掉了。

在多次的调度中发现使用MessageBox可以达到目的,但是实现的很丑,有一个弹出窗口不停的跳。

在查找资料的过程中意外地看到了Application.DoEvents(), 拿来一试果然OK, 原来并不是两个进程之间的同步问题,而是一个进程中两个事件的处理顺序问题,csdn中这样描述:Application.DoEvents 方法 ,处理当前在消息队列中的所有 Windows 消息,当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。

原来每个进程有一个消息队列,每个事件的调用都会放到这个队列中,然后根据顺序来进行处理每个事件,事件之间是不会有交叉的,而DoEvents方法就是告诉线程在这个调用时间处理队列中的所有消息。



对于搞java我来说当然会想到java里是怎么一个事件处理顺序呢?在jvm specification在看到:

AWTEvents
which were actually enqueued to a particular
EventQueue
(note that events being posted to the
EventQueue
can be coalesced) are dispatched:

Sequentially. That is, it is not permitted that several events from this queue are dispatched simultaneously.

In the same order as they are enqueued. That is, if
AWTEvent
A is enqueued to the
EventQueue
before
AWTEvent
B then event B will not be dispatched before event A.

原来也是将这些事件放入一个队列里,然后按fifo的方式顺序执行,那么有没有像Application.DoEvents()方法这样的功能可以在一个事件的执行过程中让jvm去响应该事件之后的其它事件呢,比如上面的AWTEvent A有一个循环,每次循环体都会往事件队列中放入一个事件B,那么我要在下次循环开始之前得到事件B的处理结果,应该怎么做呢?

目前找不到答案。。。

去发帖又说我没有技术分。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: