最近在用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的處理結果,應該怎麼做呢?
目前找不到答案。。。
去發帖又說我沒有技術分。。。