gpt4 book ai didi

JavaFX计时器线程问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:37 25 4
gpt4 key购买 nike

我一直在尝试使用 JavaFX 和 scenebuilder 创建计时器,但是在创建线程时遇到了一些问题。每当我按下开始按钮时,应用程序就会滞后并且永远不会真正更新文本。我一直在尝试使用 Platform.runLater(),但如上所述,一切都落后了,结果是。

以下是控制计时器的方法,链接到 FXML 文件上的特定按钮:

    @FXML
private void startTimer(){
System.out.println("started");
stopWatch.startTimer();

}

@FXML
private void pauseTimer(){
stopWatch.pauseTimer();
}

@FXML
private void stopTimer(){
System.out.println("stopped");
stopWatch.stopTimer();
}

@FXML
public void updateTimer(long dT){

//System.out.println(((dT/6000)%1000)+":"+String.valueOf((dT/1000)%1000)+","+String.valueOf((dT)%1000));
Platform.runLater(() ->{
timer.setText(String.valueOf(dT/1000) );
});
}

这是 StopWatch.java 类:

package sled.timer.address.model;

import sled.timer.address.view.PersonOverviewController;

public class StopWatch implements Runnable{

private Thread runThread;
public boolean running = false;
public boolean paused = false;


private long summedTime = 0;

PersonOverviewController personOverviewController;

String time = "";

public void count(){

}
public StopWatch(PersonOverviewController personOverviewController){
this.personOverviewController = personOverviewController;

}
public void startTimer(){
running = true;
paused = false;

runThread = new Thread(this);
runThread.start();
}

public void pauseTimer(){
paused = true;
}

public void stopTimer(){
running = false;
paused = false;
}
@Override
public void run() {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
while(running && !paused){
personOverviewController.updateTimer(summedTime + (System.currentTimeMillis() - startTime));
}
if(paused)
summedTime += System.currentTimeMillis() - startTime;

else
summedTime = 0;

}

public long getSummedTime(){
return summedTime;
}

感谢任何帮助。

最佳答案

您不限制线程的更新频率。通过这种方式,您可以发布如此多的 Runable 供应用程序线程执行,从而几乎没有时间进行事件处理和布局,从而使您的应用程序以这种方式运行。

此外,您不会同步对 boolean 标志的访问,也不会使它们易失,这意味着值更改不一定对其他线程可见。

相反,您应该确保在最后一个 Runnable 启动之前不会发布更多更新:

private final Object updaterLock = new Object();
private final boolean updating = false;
private final long value;

public void updateTimer(long dT) {
synchronized (updaterLock) {
value = dT;
if (!updating) {
updating = true;
Platform.runLater(() -> {
synchronized (updaterLock) {
updating = false;
timer.setText(Long.toString(value/1000));
}
});
}
}
}
public class StopWatch implements Runnable{

...

public volatile boolean running = false;
public volatile boolean paused = false;
<小时/>

但是请考虑使用the AnimationTimer class进行更新。该类的更新频率有限。

关于JavaFX计时器线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950577/

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