При нажатии на кнопку он застрял в то время как бесконечный цикл - PullRequest
0 голосов
/ 24 февраля 2019

В моем проекте я пытаюсь заставить сканер 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;

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Прежде всего, если вы используете поток, вы должны переопределить метод "run ()".НЕ метод "start ()".Вам нужно использовать метод "start ()" только для выполнения потока.В противном случае он будет использовать основной поток.Нет многопоточности.

Во-вторых, если «this.flag» является переменной экземпляра в вашем потоке, и ее значение динамически изменяется с помощью действий кнопки, эта переменная должна быть изменчивой.В противном случае он обычно кэшируется в цикле.( больше )

Предложение: Пожалуйста, следуйте хорошему шаблону дизайна.(Наблюдатель)

0 голосов
/ 24 февраля 2019

Вместо того, чтобы иметь петлю Thread, пока кнопка нажата, и останавливаться, когда ее нет, постоянно запускать петлю.Когда Thread достигает конца требуемого тела кода, он не выполняет второй раз , даже после вызова Thread#start.

InКороче говоря, вы просто проверите значение t.flag в вашем цикле, а если оно false, то вы можете просто перевести нить в спящий режим до следующей итерации вашего цикла.

...