当我启动线程时javafx冻结-我正在使用runlater命令

btxsgosb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(402)

我有一根这样的线。
公共类camerathread扩展线程{

  1. private AtomicBoolean runCamera;
  2. public CameraThread(AtomicBoolean runCamera) {
  3. this.runCamera = runCamera;
  4. }
  5. @Override
  6. public void run() {
  7. while (Main.RUNTHREAD) {
  8. while (runCamera.get()) {
  9. Platform.runLater(() -> {
  10. System.out.println("Hello");
  11. threadSleep();
  12. });
  13. }
  14. }
  15. }
  16. private void threadSleep() {
  17. try {
  18. Thread.sleep(2000L);
  19. } catch (InterruptedException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. }
  24. }

当我开始 runCamerarunCamera.set(true) 在线程的外面,整个gui都冻结了,我什么都做不了。
这是一个最小的例子,我不能让它正常工作。我用过 RunLater 但这次,我坐在 Dell precision M6400 从2007年开始。有没有可能这台机器不能用java处理线程?
或者我该如何解决这个问题?
要重现此问题,只需键入以下内容:

  1. wget https://github.com/DanielMartensson/Darknet-Data-Creator/archive/main.zip
  2. unzip Darknet-Data-Creator-main.zip
  3. cd Darknet-Data-Creator-main
  4. mvn javafx:run

然后点击 Scan 按钮,选择网络摄像头(usb、笔记本电脑摄像头),然后按 Save to folder 按钮。只需选择一些任意文件夹。然后按 Open camera 按钮

t8e9dugd

t8e9dugd1#

问题是你正在使用 Thread.Sleep() 内部 Platform.runLater(...) ,这意味着您正在休眠gui,而不是您的相机线程。
试试这个,注意runlater在 Platform.runLater 代码:

  1. @Override
  2. public void run() {
  3. while (Main.RUNTHREAD) {
  4. while (runCamera.get()) {
  5. Platform.runLater(() -> {
  6. System.out.println("Hello");
  7. });
  8. //Now thread sleep is outside of runLater:
  9. threadSleep();
  10. }
  11. }
  12. }

runlater中唯一应该做的是直接改变gui的事情。任何计算、睡眠、处理、文件读取等都应分开保存。

展开查看全部

相关问题