gpt4 book ai didi

java - 我想在我的小程序中添加计时器

转载 作者:行者123 更新时间:2023-12-01 04:58:46 26 4
gpt4 key购买 nike

我制作了 CountDown.java 文件,并尝试在我的 Word-trouble.java 文件(这是主小程序)中添加 CountDown ct = new CountDown();但它没有在主小程序中显示计时器。

这是编码:

package pack.urdu;
import java.awt.*; //windows toolkit

import java.applet.*; //applet support

public class CountDown extends Applet implements Runnable{

int counter; Thread cd;

public void start() { // create thread

counter = 60; cd = new Thread(this); cd.start();

}

public void stop() { cd = null;}

public void run() { // executed by Thread

while (counter>0 && cd!=null) {

try{Thread.sleep(1000);} catch (InterruptedException e){}

--counter; repaint(); //update screen

}

}

public void paint(Graphics g) {

g.drawString(String.valueOf(counter),25,75);

}

}

最佳答案

你犯了一个我看到很多程序员都会犯的错误:你混淆了耗时的计算和刷新时间的计算。如果由于线程争用而 sleep 持续时间超过一秒,您的计时器将会漂移。

不必跟踪每秒递增的计数器,只需记录开始时间:

long startTime = System.currentTimeMillis();

然后,你的绘制方法就变成了:

public void paint(Graphics g) {
int elapsedSeconds = (int)(System.currentTimeMillis()-startTime)/1000
g.drawString(String.valueOf(elapsedSeconds),25,75);
}

可以根据需要多次调用此方法,并且它始终会显示正确的已用秒数。无需在任何指定时间增加任何内容。

您唯一需要做的另一件事是安排屏幕刷新。 (我想说,您只需在用户查看屏幕时刷新屏幕:-),但因为我们不知道我们需要更频繁地刷新)。其机制可能取决于图形库。一个懒惰的想法是每秒刷新十次,屏幕大部分时间都会正确。

如果您确实希望有一个发送重绘事件的线程,则应该在计时器点击到新值时发送这些事件,从而每秒仅发送一个。这是通过以下方式完成的:

while (stillRunning) {
long elapsedTime = System.currentTimeMillis() - startTime;
long timeTillNextDisplayChange = 1000 - (elapsedTime % 1000);
Thread.sleep(timeTillNextDisplayChange);
repaint();
}

注意,你不要 hibernate 1000ms!如果您的系统性能良好,这将非常接近 1000 毫秒,但略小于考虑 (1) 线程启动延迟(可能由线程争用引起)和 (2) 此循环的处理时间(即相当小)。无论如何,以这种方式计算 sleep 将防止计时器漂移,并确保您的显示随着秒值的变化而更新。

查看 Common Misunderstandings of Timers 的扩展讨论在我的网站上。

关于java - 我想在我的小程序中添加计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658186/

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