RFID поток не работает в фоновом режиме - PullRequest
0 голосов
/ 08 января 2020

Я занимаюсь разработкой программы GUI на JavaFX, которая выполняется в основном потоке, также существует метод RFID, который открывает считыватель для сбора данных, и этот метод RFID должен выполняться в фоновом режиме одновременно с окном GUI , то, что происходит в данный момент, это то, что метод RFID запускается сначала, пока не завершится (5 секунд), а затем GUI запускается сразу после этого. Таким образом, я попытался запустить метод RFID в отдельном потоке и поместить в метод run, но была бы ошибка, как показано:

    RFID rfid = new RFID(); // Error message : Default constructor cannot handle exception type PhidgetException thrown by implicit super constructor. Must define an explicit constructor

Так что я обнаружил, что исправить эту ошибку мне нужно иметь конструктор, (public MainController () { ... } ) и вызов run внутри него, но на самом деле это ничего не помогает. Потоки GUI и RFID по-прежнему работают отдельно один за другим.

Любые предложения, ребята, я был бы очень благодарен и признателен!

Класс MainController:

public class MainController extends Thread {
RFID rfid = new RFID();

public void run(){

    rfid.addTagListener(new RFIDTagListener() {
    public void onTag(RFIDTagEvent e) {

        try {
            ReaderNo = String.valueOf(rfid.getDeviceSerialNumber());
        } catch (PhidgetException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.out.println("Reader serial number is " + ' '+ReaderNo);
        wallet walletData = new wallet("385055");   
        walletJson = gson.toJson(walletData);       

        String resultfromserver = sendToServer(walletJson); 
        System.out.println("DEBUG: data in json : " +resultfromserver);
        wallet  walletObject = gson.fromJson(resultfromserver, 
        wallet.class);                      
        System.out.println("DEBUG: The wallet's Data: "+' '+ walletObject);

        WalletName.setText(walletObject.getWalletName());
       }
     });

       rfid.addTagLostListener(new RFIDTagLostListener() {
      // What to do when a tag is lost
       public void onTagLost(RFIDTagLostEvent e) {
      // optional print, used as debug here
       System.out.println("DEBUG: Tag lost: " + e.getTag());
       }
     });

        try {
        rfid.open(50000);
        } catch (PhidgetException e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
     }

        try {                                       
        System.out.println("\n\nGathering data for 15 seconds\n\n");
        Thread.sleep(15000);
        } catch (Exception ex) {
        ex.printStackTrace();
      }

        try {
        rfid.close();
        } catch (PhidgetException e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
      }
 }

        public MainController() throws PhidgetException {
        run();
     }
   }

Основной класс:

        public class Main extends Application {
        public static void main(String[] args) throws PhidgetException {        
        launch(args);
        MainController object = new MainController(); 
        object.start(); 
          }
        }
...