gluonfx-maven-plugin icon indicating copy to clipboard operation
gluonfx-maven-plugin copied to clipboard

(macos)Abnormal program termination

Open mbbee opened this issue 5 years ago • 1 comments

This code behaves only wrong, if compiled to native-image in macos (eg. Windows works). The binary file does not reach the marked "// problematic location".

This code aslo works well when started within eclipse ...
-> as i said, only macos native-image is problematic Please help! thx

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;

import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;

public class TestJavaFXnativeMacos {
	private static AtomicBoolean startApp = new AtomicBoolean(false);
	private static AtomicBoolean runningSync = new AtomicBoolean(true);

	final static CountDownLatch waitSyncLatch = new CountDownLatch(1);
	final static CountDownLatch askContinueLatch = new CountDownLatch(1);

	private static Alert syncDialog = null;
	private static Thread syncThread = null;

	public static void main(String[] args) {
		Platform.startup(() -> {
		});
		Platform.setImplicitExit(false);

		try {
			start();
		} catch (Throwable e) {
			System.err.println(e.getLocalizedMessage());
		}

		System.out.println("exiting javafx...");
		Platform.exit();
	}

	private static void start() throws InterruptedException {
		System.out.println("starting ....");
		Platform.runLater(() -> {
			syncDialog = new Alert(Alert.AlertType.INFORMATION);
			syncDialog.setTitle("prepare app");
			syncDialog.setHeaderText("Syncing app ...");
			syncDialog.getButtonTypes().clear();
			syncDialog.getButtonTypes().addAll(ButtonType.CANCEL);
			if (syncDialog.showAndWait().get() == ButtonType.CANCEL) {
				System.out.println("button cancel pressed ...");
				runningSync.set(false);
			}
			waitSyncLatch.countDown();
		});
		syncThread = new Thread(() -> {
			int i = 0;
			int end = 5;
			while (runningSync.get() && i < end) {
				System.out.println("fake sync ... " + (i+1) + " of " + end);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				i++;
			}
			Platform.runLater(() -> {
				syncDialog.close();
			});
			waitSyncLatch.countDown();
		});
		syncThread.setDaemon(true);
		syncThread.start();

		waitSyncLatch.await();
		System.out.println("sync ended ...");
		System.out.println("asking user to start app - checkpoint 1");
		Platform.runLater(() -> {
			System.out.println("asking user to start app - checkpoint 2");// problematic location
			Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
			System.out.println("asking user to start app - checkpoint 3");
			alert.setTitle("App");
			alert.setHeaderText("Start app ?");
			alert.setOnCloseRequest(event -> {
			});

			if (alert.showAndWait().get() == ButtonType.CANCEL) {
				startApp.set(false);
			} else {
				startApp.set(true);
			}
			askContinueLatch.countDown();
		});
		System.out.println("let main thread wait ....");
		askContinueLatch.await();
		System.out.println("startApp: " + startApp.get());
		System.out.println("App ended ....");
	}
}

mbbee avatar Jul 06 '20 08:07 mbbee

It has something to do with Platform.setImplicitExit(false);

mbbee avatar Jul 11 '20 15:07 mbbee