我有一个像这样的循环:
while (!exit){
read/write on file
}
我的框架上有一个按钮,他的动作会改变“退出”的值,即循环的退出条件。
我的问题,我被困在循环中,我无法点击我的按钮,因为我认为该程序一直处于循环中。
有人告诉我用线程查看“轮询”,但我不明白我如何能够整合到我的循环中?
编辑:
我如何称呼线程:
case "Mode Measure": {
JOptionPane.showMessageDialog(null,"Radar in Measure Mode : ON ");
System.out.println("READ Mode : ON ");
JB_MeasurMode.setVisible(true);
JB_MeasurMode.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
sortie = true;
}
});
SwingUtilities.invokeLater(new Runnable() {
public void run() {
CommPortIdentifier portId = null;
try {
portId = CommPortIdentifier.getPortIdentifier(ChoixPortCom);
serialPort = (SerialPort) portId.open("Main Frame", 5000);
System.out.println("serialPort ouvert");
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
serialPort.setRTS(false);
serialPort.setInputBufferSize(8192);
serialPort.setOutputBufferSize(8192);
serialPort.setSerialPortParams(115400,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN |SerialPort.FLOWCONTROL_XONXOFF_OUT);
catch (NoSuchPortException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (PortInUseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Dans le while");
while(sortie == false) {
int i = 0;
int availableBytes = 0;
try {
int read = 0;
availableBytes = inputStream.available();
if (availableBytes > 0) {
String tradV3 = null;
System.out.println("je suis dans le availableBytes > 0 du while -- read = "+read);
read = read + availableBytes;
int raw = inputStream.read(readBuffer, read-availableBytes, availableBytes);
traduction = new String(readBuffer, read-availableBytes, raw);
System.out.println("2=>" + traduction);
tradV3 = tradV3 + traduction; // bytes -> String
}
if (read == 19){
System.out.println("une donnee de 19 char lue -- read = "+read);
System.out.println("Non-Traité :"+Arrays.toString(readBuffer));
int[] tab_int2 = new int[19];
tab_int2 = Fonction.Get_Msg_19(readBuffer);
String Msg_affiche2 = Arrays.toString(tab_int2);
System.out.println("Traité : "+Msg_affiche2);
Measure t = new Measure();
t.GetMeasure(tab_int2);
Tab_Measure[i] = t;
i++;
}
} catch (IOException e) {
System.out.println("Problem avec le try !!!");
}
}
System.out.println("Sortie du while");
}
});
break;
}
答案 0 :(得分:1)
因为读/写操作可能是一个非常长的任务,所以你应该在不同的线程中执行它以不阻塞主UI线程。
SwingWorker类可能很有用,因为它是为处理这样的长时间任务而创建的。 看看这里:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
如果你使用的是SwingWorker而不是你的旗帜,当有人按你的按钮时你应该调用SwingWorker的取消方法。
答案 1 :(得分:1)
您可能正在GUI线程中运行循环,该线程还负责处理按钮单击。虽然它在while循环中停留,但它不能用于更改变量' exit'的值。在单独的线程中进行读/写,在Swing中有一个便利类:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// IO stuff
}
});