gpt4 book ai didi

JavaFX 终止后台任务

转载 作者:行者123 更新时间:2023-12-01 11:10:30 24 4
gpt4 key购买 nike

我有外部Processor.process(...)重型方法,在正常情况下可以运行很长时间(几十分钟)。

我想显示一些带有“取消”按钮的加载屏幕并在后台运行该处理器。我想在单击“取消”按钮时停止执行后台任务。

问题是我对 Processor.process(...) 进行了一次调用。如果我在循环中执行某些任务,我会执行诸如 if( isCancelled() ){ break; 之类的检查} 或每次迭代中的类似内容。

有什么方法可以终止|杀死繁重的后台任务吗?让我们假设 Processor.process(...) 是非常长的“原子”操作(我只是不想更改其背后的所有逻辑来完成这个单一任务)

这是我开始加载屏幕和后台任务的方法:

private void handleProcess(ActionEvent event) {

SomeService service = new SomeService();
// ... configuring service

Stage loadingStage = new Stage();
// ... configuring 'loading' stage

service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {

@Override
public void handle(WorkerStateEvent t) {
@SuppressWarnings("unchecked")
Entity entity = (Entity) t.getSource().getValue();
// ... do some stuff
loadingStage.close();
}
});

service.start(); // launch background process
loadingStage.show(); // show 'loading' screen
}

更新这是后台作业的服务:

private static class SomeService extends Service<Entity> {
private Thread threadToStopOnCancel; // added
// fields, getters, setters omitted

protected Task<Entity> createTask() {

// _params initialization omitted
return new Task<Entity>() {
protected Entity call() throws IOException {
threadToStopOnCancel = Thread.currentThread(); // added
return Processor.process(_params);
}
};
}

@SuppressWarnings("deprecation")
@Override
protected void cancelled() {
if (threadToStopOnCancel != null) { threadToStopOnCancel.stop(); } // added
super.cancelled();
}

现在,我从加载屏幕调用 service.cancel();。但它只是将服务的状态设置为“CANCELED”,并且该任务仍在后台运行。

最佳答案

在服务定义中,您可以重写 cancelled() 方法或将 EventHandler 传递给 setOnCancelled() 方法。

参见here

关于JavaFX 终止后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444530/

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