2013-04-28 62 views
0

我有兩個SWT按鈕,按鈕(「開始」)&按鈕(「停止」)。當我按下「開始」時,我調用方法: printFiles(inputPath,printer)//掃描pdf的「inputPath」目錄並將它們發送到打印機「打印機」如何同步兩個swt按鈕的事件?

我想printFiles(inputPath,printer)始終運行,直到我按下按鈕(「停止」)。所以,這是我的第一個想法如何做到這一點。

//button("Start") 
btnStart.addSelectionListener(new SelectionAdapter() { 
@Override 
public void widgetSelected(SelectionEvent arg0) { 
    keepPrinting=true; 
    while(keepPrinting){ 
     printFiles(inputPath, printer); 
    } 
} 
}); 

//button("Stop") 
btnStop.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent arg0) { 
      keepPrinting=false; 
     } 
}); 

但是,有一個明顯的問題。當我按下按鈕(「開始」)時,它永遠不會從while(true)循環返回。結果,整個窗口(shell)停止響應。

你有什麼想法如何把無盡的循環內按鈕的新聞聽衆?

我的instict說我必須使用併發性來以某種方式同步這兩個按鈕。如果這是正確的,你可以提供一些提示如何實現它?

非常感謝!

+0

你爲什麼不使用['Thread'](http://docs.oracle .com/javase/tutorial/essential/concurrency/runthread.html)爲'printFiles'?這樣GUI不會凍結。 – Baz 2013-04-28 12:29:04

回答

1

您不應該在GUI線程上執行冗長的任務。相反,開始一個新的線程來完成這項工作。在這個簡單的情況下,你不需要複雜的同步機制,只需更換

while(keepPrinting){ 
    printFiles(inputPath, printer); 
} 

new Thread() { 
    @Override 
    public void run() { 
     while (keepPrinting) { 
      printFiles(inputPath, printer); 
     } 
    }    
}.start(); 
+0

你是對的,這工作。 感謝您的幫助。 – nidis 2013-04-28 18:34:17