2013-04-28 60 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