我有一个来自 GUI 问题的用例,我想提交给您的睿智。
用例
我有一个 GUI,它根据用户在 GUI 中设置的一些参数显示计算结果。例如,当用户移动滑块时,会触发几个事件,这些事件都会触发新的计算。当用户将滑块值从 A 调整到 B 时,会触发几十个事件。
但是计算可能需要几秒钟,而滑块调整可以每 100 毫秒触发一次事件。
如何编写一个合适的线程来监听这些事件,并过滤它们以使结果的重绘更加生动?理想情况下,您会想要类似的东西
- 收到第一个更改事件后立即开始新的计算;
- 如果接收到新事件,则取消第一次计算,并使用新参数开始新的计算;
- 但要确保最后一个事件不会丢失,因为最后完成的计算需要是具有最后更新参数的计算。
我试过的
我的一个朋友 (A. Cardona) 提出了更新程序线程的这种低级方法,可以防止太多事件触发计算。我在这里复制粘贴(GPL):
他把它放在一个扩展 Thread 的类中:
public void doUpdate() {
if (isInterrupted())
return;
synchronized (this) {
request++;
notify();
}
}
public void quit() {
interrupt();
synchronized (this) {
notify();
}
}
public void run() {
while (!isInterrupted()) {
try {
final long r;
synchronized (this) {
r = request;
}
// Call refreshable update from this thread
if (r > 0)
refresh(); // Will trigger re-computation
synchronized (this) {
if (r == request) {
request = 0; // reset
wait();
}
// else loop through to update again
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void refresh() {
// Execute computation and paint it
...
}
每次 GUI 发送一个事件表明参数已更改时,我们调用updater.doUpdate()
. 这导致该方法refresh()
被调用的次数要少得多。但我无法控制这一点。
其他方式?
我想知道是否有另一种方法可以使用 jaca.concurrent 类。但是我无法在 Executors 框架中排序我应该从哪个开始。
你们中有人有类似用例的经验吗?
谢谢