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在看到:
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
原来也是将这些事件放入一个队列里,然后按fifo的方式顺序执行,那么有没有像Application.DoEvents()方法这样的功能可以在一个事件的执行过程中让jvm去响应该事件之后的其它事件呢,比如上面的AWTEvent A有一个循环,每次循环体都会往事件队列中放入一个事件B,那么我要在下次循环开始之前得到事件B的处理结果,应该怎么做呢?
目前找不到答案。。。
去发帖又说我没有技术分。。。
起初以为是进程间同步的问题,所以使用一个全局变量来实现两个进程间的同步,结果程序死掉了。
在多次的调度中发现使用MessageBox可以达到目的,但是实现的很丑,有一个弹出窗口不停的跳。
在查找资料的过程中意外地看到了Application.DoEvents(), 拿来一试果然OK, 原来并不是两个进程之间的同步问题,而是一个进程中两个事件的处理顺序问题,csdn中这样描述:Application.DoEvents 方法 ,处理当前在消息队列中的所有 Windows 消息,当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。
原来每个进程有一个消息队列,每个事件的调用都会放到这个队列中,然后根据顺序来进行处理每个事件,事件之间是不会有交叉的,而DoEvents方法就是告诉线程在这个调用时间处理队列中的所有消息。
对于搞java我来说当然会想到java里是怎么一个事件处理顺序呢?在jvm specification在看到:
AWTEventswhich were actually enqueued to a particular
EventQueue(note that events being posted to the
EventQueuecan 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
AWTEventA is enqueued to the
EventQueuebefore
AWTEventB then event B will not be dispatched before event A.
原来也是将这些事件放入一个队列里,然后按fifo的方式顺序执行,那么有没有像Application.DoEvents()方法这样的功能可以在一个事件的执行过程中让jvm去响应该事件之后的其它事件呢,比如上面的AWTEvent A有一个循环,每次循环体都会往事件队列中放入一个事件B,那么我要在下次循环开始之前得到事件B的处理结果,应该怎么做呢?
目前找不到答案。。。
去发帖又说我没有技术分。。。
相关文章推荐
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
- C#中在窗体间使用消息来处理相关联的事件
- Java与C#事件处理详细对比
- Java与C#的事件处理机制(zt)
- C# 复习笔记 消息与事件处理
- C# Application.DoEvents() 处理队列消息,防界面假死。
- 浅析Java与C#的事件处理机制(转)
- 浅谈Java与C#的事件处理机制
- coco笔记:连续点击相应事件处理(使用协同)_ Java和C#
- C# 模拟一个处理消息队列的线程类 Message Queue
- 浅析Java与C#的事件处理机制
- C#应用消息队列异步处理数据存储
- C#中消息处理机制(事件与委托)
- C# Application.DoEvents() 处理队列消息,防界面假死。
- 浅析Java与C#的事件处理机制
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
- 程序员手记:Java与C#的事件处理机制
- Flex、Java、C#、JavaFX的事件处理机制的比较
- lua 协程 | 协程实现消息机制(事件队列轮询处理机制)
- Flex、Java、C#、JavaFX的事件处理机制的比较