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

本文探讨了C#中遇到的事件处理问题,特别是在button click事件中如何确保事件处理顺序。通过分析,发现是同一进程中事件处理的顺序问题,而非进程间同步。应用Application.DoEvents()解决了问题,它处理了消息队列中的所有Windows消息。同时,文章引发了对Java中事件处理顺序的思考,引用了JVM规范的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近在用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 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的处理结果,应该怎么做呢?

    目前找不到答案。。。

    去发帖又说我没有技术分。。。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值