我已经多次重写了这段时间,但我暂时找不到解决这个问题的方法。其他一些类使用以下行写 gps.log 文件:
2014-09-02 10:23:13 35.185604 33.859077
2014-09-02 10:23:18 35.185620 33.859048
我正在尝试读取文件的最后一行并更新用户界面中的文本字段。下面的Thread
将CPU过载到85-100%。
我保持文件很小(100行 - <5KB)。我已经使用CSV很长一段时间了,我认为每3秒读一次这个文件不应该在CPU上占用这个空间。虽然我过去一直在阅读巨大的CSV文件,但现在我第一次遇到这个问题,我每隔几秒就会尝试更新一次用户界面。我是如何更新文本字段的?有任何想法吗?
谢谢你的期待。
new Thread(new Runnable() {
public void run() {
while (true) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
try { Thread.sleep(3000); } catch (Exception e) { }
BufferedReader gpslog = new BufferedReader(new FileReader("log/gps.log"));
String line = "";
String lastLine = "";
int i=0;
while (line != null) {
i++;
lastLine = line;
line = gpslog.readLine();
}
//System.out.println(lastLine);
gpslog.close();
if (lastLine != null) { txtGPSStatus.setText(lastLine); }
//If more than 100 gps entries, flush the file
if (i>100) {
PrintWriter writer = new PrintWriter("log/gps.log");
writer.close();
}
} catch (IOException e1) {
log.error(e1);
}
}
});
}
}
}).start();
答案 0 :(得分:0)
移动
尝试{Thread.sleep(3000); } catch(例外e){}
所以它就在
之后while(true){
然后你会跑步,等待3秒,跑步等等。
答案 1 :(得分:0)
您应该清楚了解后台线程应该做什么以及UI线程的用途!
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
public void run() {
try {
while (true) {
updateLog();
Thread.sleep(3000);
}
} catch (InterruptedException ex) {
// restore interruption flag
Thread.currentThread().interrupt();
}
}
});
private void updateLog() {
String lastLine = readLastLogLine();
Display.getDefault().syncExec(new Runnable() {
public void run() {
txtGPSStatus.setText(lastLine);
}
});
}