当按下一个按钮时,它会陷入无限循环
When pressed a button it stuck in while infinite loop
对于我的项目,我正在尝试通过按下一个按钮并在按下停止按钮时松开它来让 RFID 扫描仪一直处于 运行,但是我已经尝试过一段时间循环但是问题似乎是,当我按下按钮代码时,一切正常,它确实进入了一个循环,但是在按下按钮后,它不让我按下任何其他东西,因为它卡在了 while 循环中,有没有办法让它保持在一个循环中循环但同时可以使用停止按钮停止它。
@Override
public void start() {
while (this.flag) {
try {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
CardTerminal terminal = terminals.get(0);
System.out.println("Waiting for a card..");
if (terminal == null) {
return;
}
terminal.waitForCardPresent(0);
Card card = terminal.connect("T=1");
System.out.println("Card: " + card);
System.out.println("Protocol: " + card.getProtocol());
CardChannel channel = card.getBasicChannel();
ResponseAPDU response = channel.transmit(new CommandAPDU(new byte[]{(byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00}));
System.out.println("Response: " + response.toString());
if (response.getSW1() == 0x63 && response.getSW2() == 0x00) {
System.out.println("Failed");
}
System.out.println("UID: " + bin2hex(response.getData()));
getUid = bin2hex(response.getData());
Thread.sleep(1000);
} catch (CardException e) {
System.out.println();
JOptionPane.showMessageDialog(null, "Device Not Connected " + e.getMessage());
} catch (InterruptedException ex) {
Logger.getLogger(CardId.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
还有我的开始按钮
t = new CardId();
t.start();
这是我的停止按钮
t.flag = false;
与其让 Thread
在按下按钮时循环,并在未按下时停止,不如让 运行 不断循环。当 Thread
到达其所需代码主体的末尾时,it does not execute a second time,即使在调用 Thread#start
.
之后
简而言之,您只需检查循环中 t.flag
的值,如果它是 false
,那么您可以让线程休眠直到循环的下一次迭代。
首先,如果您使用的是线程,则应覆盖 "run()" 方法。不是 "start()" 方法。您只需要使用 "start()" 方法来执行线程。否则,它将使用主线程。没有多线程。
第二件事是,如果 "this.flag" 是线程中的实例变量,并且它的值通过按钮操作动态更改,则该变量应该是可变的。否则它通常被缓存在循环中。 ()
建议:请遵循良好的设计模式。 (观察员)
对于我的项目,我正在尝试通过按下一个按钮并在按下停止按钮时松开它来让 RFID 扫描仪一直处于 运行,但是我已经尝试过一段时间循环但是问题似乎是,当我按下按钮代码时,一切正常,它确实进入了一个循环,但是在按下按钮后,它不让我按下任何其他东西,因为它卡在了 while 循环中,有没有办法让它保持在一个循环中循环但同时可以使用停止按钮停止它。
@Override
public void start() {
while (this.flag) {
try {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
CardTerminal terminal = terminals.get(0);
System.out.println("Waiting for a card..");
if (terminal == null) {
return;
}
terminal.waitForCardPresent(0);
Card card = terminal.connect("T=1");
System.out.println("Card: " + card);
System.out.println("Protocol: " + card.getProtocol());
CardChannel channel = card.getBasicChannel();
ResponseAPDU response = channel.transmit(new CommandAPDU(new byte[]{(byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00}));
System.out.println("Response: " + response.toString());
if (response.getSW1() == 0x63 && response.getSW2() == 0x00) {
System.out.println("Failed");
}
System.out.println("UID: " + bin2hex(response.getData()));
getUid = bin2hex(response.getData());
Thread.sleep(1000);
} catch (CardException e) {
System.out.println();
JOptionPane.showMessageDialog(null, "Device Not Connected " + e.getMessage());
} catch (InterruptedException ex) {
Logger.getLogger(CardId.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
还有我的开始按钮
t = new CardId();
t.start();
这是我的停止按钮
t.flag = false;
与其让 Thread
在按下按钮时循环,并在未按下时停止,不如让 运行 不断循环。当 Thread
到达其所需代码主体的末尾时,it does not execute a second time,即使在调用 Thread#start
.
简而言之,您只需检查循环中 t.flag
的值,如果它是 false
,那么您可以让线程休眠直到循环的下一次迭代。
首先,如果您使用的是线程,则应覆盖 "run()" 方法。不是 "start()" 方法。您只需要使用 "start()" 方法来执行线程。否则,它将使用主线程。没有多线程。
第二件事是,如果 "this.flag" 是线程中的实例变量,并且它的值通过按钮操作动态更改,则该变量应该是可变的。否则它通常被缓存在循环中。 (
建议:请遵循良好的设计模式。 (观察员)