2012-02-08 36 views
2

我有一個Java應用程序,很多線程正在快速寫入StyledTextBox。在某個時候,所有的線程都被終止。但是,TextBox繼續接收文本的一點可能是因爲派遣隊列有點備份。是否有可能以某種方式強制EDT被刷新,以便當線程終止時,TextBox的更新立即結束?需要刷新Java EDT(事件調度隊列)

謝謝你,吉姆

回答

1

好的,我找到了解決方案。這個想法是安裝一個「驗證」監聽器,只要文本即將被添加到StyledText就會被調用。所以當文本即將被添加(從備份的分派隊列中)時,代碼會查找一個標記來指示線程是否被終止。如果線程已被終止,則忽略文本更新。這允許控件停止更新,同時允許排除事件隊列。以下代碼片段解決了這個問題。

txtOutputStyledText控制。
endingThreads是線程終止時boolean設置爲true
這似乎是處理SWT應用程序中問題的最簡單方法。

 txtOutput.addVerifyListener(new VerifyListener() { 
     public void verifyText(VerifyEvent e) 
     { 
      if(!endingThreads) 
      { 
       e.doit = true; 
      } 
      else 
      { 
       e.doit = false; 
      } 
     } 
    }); 
+0

+1'e.doit =!endingThreads'會相當嗎? – trashgod 2012-02-09 03:33:06

+0

是的,你的線條是相當的,而且更簡潔。 – Chimera 2012-02-09 03:36:26

2

使用隊列爲你改變文本應用,日程事件的是工作隊列爲空返回之前的EDT。這會導致「空」事件,一旦線程完成並且EDT上的另一個計劃事件開始運行。

+0

謝謝你的回覆。如果無法直接刷新事件隊列,那麼我需要實現類似於您的建議的解決方案。 – Chimera 2012-02-08 01:04:38

5

你可以push()自己的EventQueue子類,如圖所示here,並添加自己的flush()方法來清空隊列。請注意,getNextEvent()如果隊列爲空,請先檢查peekEvent()

+0

謝謝你的迴應。該方法是否也適用於SWT應用程序? – Chimera 2012-02-08 16:54:48

+0

啊,我不認識StyledTextBox作爲SWT組件;我希望添加標籤。 AFAIK,SWT不使用'EventQueue'。 – trashgod 2012-02-08 17:39:14

+0

謝謝,添加了SWT標籤 – Chimera 2012-02-08 17:58:31