从任务线程更新imageView

时间:2016-05-08 11:49:30

标签: java multithreading javafx-8

我写了一个光线跟踪渲染应用程序,现在我正在尝试将它连接到GUI。我想实现从白色画布到结果的逐像素处理渲染效果。具体来说,当我的跟踪应用程序计算某些像素的颜色时,我希望它会立即写入图像。而不是GUI在渲染时被冻结并且仅显示最终结果。然后我决定在后台线程中运行渲染过程来修复它。在阅读了一些文档后,我发现为了动态更新GUI,请使用Tasks和Platform.runLater方法。那是与我的问题相关的代码: 在RenderWindowController中,我将ImageView连接到XML表单

@FXML
private volatile ImageView imageView;

创建场景后,此代码运行渲染过程

Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            world.getCamera().renderScene(world);
            return null;
        }
    };

方法renderScene遍历图像的行和列,并计算每个像素的颜色

...
WritableImage img = ...
PixelWriter pixelWriter = img.getPixelWriter();
for rows {
    for columns {
...
pixelColor = tracer.traceRay();
pixelWriter.setColor(column, row, pixelColor);
Platform.runLater(() ->  *reference to my ImageView*.setImage(image));
    } 
}

这段代码与我没有使用线程的方式相同。 我是线程和JavaFX的新手。谁能指出我做错了什么?

1 个答案:

答案 0 :(得分:-3)

这个链接可能对阅读有用。这与Swing中的并发性有关。 该链接包含一些代码示例。

https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

e.g。

   import javafx.concurrent.Task;

    Task<Integer> task = new Task<Integer>() {
     @Override protected Integer call() throws Exception {
     int iterations;
     for (iterations = 0; iterations < 100000; iterations++) {
        if (isCancelled()) {
           break;
        }
        System.out.println("Iteration " + iterations);
     }
     return iterations;
    }
   };

import javafx.concurrent.Task; Task<Integer> task = new Task<Integer>() { @Override protected Integer call() throws Exception { int iterations; for (iterations = 0; iterations < 100000; iterations++) { if (isCancelled()) { break; } System.out.println("Iteration " + iterations); } return iterations; } };