gpt4 book ai didi

java - 关于运行 GUI 时线程的问题

转载 作者:行者123 更新时间:2023-12-02 01:39:22 24 4
gpt4 key购买 nike

我目前正在为 Uni 编写一个程序,该程序使用 RFID 跟踪器来跟踪 RFID 标签通过时的移动。这是模仿钱包穿过房间时的移动。

我在 GUI 中添加了一个按钮,用于初始化跟踪器并在标签通过跟踪器时更新我的​​数据库。他们在线停留 60 秒,一切正常。然而,一旦按下这个按钮,我的 GUI 就会卡住,直到进程停止。这会阻止我的 GUI 上的表更新。

我意识到我需要使用线程,我发现 SwingWorker 看起来不错,但是在尝试理解它一段时间后我似乎无法弄清楚。

我想知道是否有比我更有经验的人可以告诉我 SwingWorker 是否可以满足我的需要,并就如何使用它提供一些建议。

以下是我的代码的一些片段:

跟踪 JButton:

JButton trackingButton = new JButton("Start Tracking");
trackingButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
RFIDHandler.openRFID(); //runs the RFID readers
} catch (PhidgetException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

我的 openRFID 方法的开始:

public static void openRFID() throws PhidgetException, SQLException {   

RFID phid1 = new RFID();
RFID phid2 = new RFID();
WalletDAO dao = new WalletDAO();

// Open and start detecting rfid cards
phid1.open(5000); // wait 5 seconds for device to respond
phid2.open(5000); // wait 5 seconds for device to respond


phid1.setAntennaEnabled(true);
phid2.setAntennaEnabled(true);

// Make the RFID Phidget able to detect loss or gain of an rfid card
phid1.addTagListener(new RFIDTagListener() {
public void onTag(RFIDTagEvent e) {
try {
Wallet w = dao.getWallet(e.getTag());
String location = w.getLocation();
System.out.println(location);

if(Objects.equals(location, "Room A")) {
System.out.println(w.getName() + "'s Wallet read");
w.setLocation("Room B");
try {
dao.updateLocation(w);
WalletLocatorInterface.refreshTable(); // refreshes table on GUI
System.out.println("Currently in room B");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
// ... else statement + another TagListener

System.out.println("Gathering data for 60 seconds\n\n");
try {
Thread.sleep(60000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

phid1.close();
phid2.close();
System.out.println("\nClosed RFIDs");
}

如果您需要我解决任何问题,请告诉我,谢谢。

最佳答案

你的问题是Thread.sleep。您可以使用 ScheduledExecutorService 完成您在这里所做的事情。只需将您的代码修改为:

...
System.out.println("Gathering data for 60 seconds\n\n");
try {
Thread.sleep(60000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

Executors.newScheduledThreadPool(1).schedule(() -> {
phid1.close();
phid2.close();
System.out.println("\nClosed RFIDs");
}, 60, TimeUnit.SECONDS);
}

(顺便我用了lambda表达式,可以解释为 here 。)

关于SwingWorker,我没有太多经验。但是,使用 SwingWorker,您可以在后台执行操作,并且在更新时不会使 GUI 出现卡顿。 但是,如果您没有真正更新 GUI,就像 @MadProgrammer 所说的那样,那么您就不会真正从使用 SwingWorker 中受益。

关于java - 关于运行 GUI 时线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54659623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com