最近在用C#做一个东西,遇到的情况是在一个button的click事件中循环的激发另一个事件,并且每次都要处理完上一次激发的事件之后再进行下一次的循环,具体请看这个帖子:http://topic.youkuaiyun.com/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 particularEventQueue
(note that events being posted to theEventQueue
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 theEventQueue
beforeAWTEvent
B then event B will not be dispatched before event A. - That is, if
原来也是将这些事件放入一个队列里,然后按fifo的方式顺序执行,那么有没有像Application.DoEvents()方法这样的功能可以在一个事件的执行过程中让jvm去响应该事件之后的其它事件呢,比如上面的AWTEvent A有一个循环,每次循环体都会往事件队列中放入一个事件B,那么我要在下次循环开始之前得到事件B的处理结果,应该怎么做呢?
目前找不到答案。。。
去发帖又说我没有技术分。。。
- Sequentially.