c#訊息佇列,事件處理(java)

來源:互聯網
上載者:User

 最近在用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的處理結果,應該怎麼做呢?

    目前找不到答案。。。

    去發帖又說我沒有技術分。。。

     

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.