Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 2 javafx后台任务未多次运行_Javafx 2_Task - Fatal编程技术网

Javafx 2 javafx后台任务未多次运行

Javafx 2 javafx后台任务未多次运行,javafx-2,task,Javafx 2,Task,下面是我的任务初始化 final Task<Void> vt=voiceTask(); Button btn = new Button(); btn.setText("Say"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent

下面是我的任务初始化

        final Task<Void> vt=voiceTask();
        Button btn = new Button();
        btn.setText("Say");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                new Thread(vt).start();
            }
        });
final Task vt=voiceTask();
按钮btn=新按钮();
btn.setText(“Say”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
新线程(vt.start();
}
});
这是任务编码

public Task<Void> voiceTask() {
    return new Task<Void>(){
        @Override
        protected Void call() throws Exception {
            HelloWorld hw=new HelloWorld();// HelloWorld is simple .java class getting voice through sphinx
            updateMessage(hw.Hello());
            return null;

        }

    };
}     
public任务voiceTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
HelloWorld hw=new HelloWorld();//HelloWorld很简单。java类通过sphinx获得语音
updateMessage(hw.Hello());
返回null;
}
};
}     
现在,在第一次单击btn按钮时,任务正常运行,但在随后的时间单击时,任务不会被调用

我希望每次单击都能调用任务。 请建议我如何修改代码以执行此操作…

请参阅

与FutureTask一样,任务是一次性类,不能重用

每次按下按钮时,您都需要创建一个新任务

    final Button btn = new Button();
    btn.setText("Say");
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            final Task<Void> vt=voiceTask();
            vt.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
                @Override
                public void handle(WorkerStateEvent event) {
                    btn.setDisable(false);
                }
            });
            btn.setDisable(true);
            new Thread(vt).start();
        }
    });
final Button btn=new Button();
btn.setText(“Say”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
最终任务vt=语音任务();
vt.setOnSucceeded(新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateEvent事件){
btn.setDisable(假);
}
});
btn.setDisable(真);
新线程(vt.start();
}
});

实际上,每当任务启动时,我都会使用麦克风事件,现在第二次按下按钮会创建一个新任务,但麦克风仅被旧任务占用。我想取消旧线程,但这也不能解决问题。你能建议我如何在完全终止旧线程时释放旧线程占用的资源,以便再次按下按钮时,新任务可以使用这些资源。最简单的方法是在任务运行时禁用按钮。为此,我更新了代码。如果任务从未退出,那么这就是HelloWorld.hello()方法的问题,它实际上是关于您正在使用的语音库的问题,而不是JavaFX问题。