Проблема обновляет Label и TextField в приложении JavaFX, используя поток [duplicate]

Если кому-то понадобится ядро ​​dotnet, dotnet cli разработал реализацию на основе taskill, как упоминалось выше, и рекурсивный pgrep / kill для систем на основе unix. Полная реализация может быть найдена на github . К сожалению, класс является внутренним, поэтому вам придется скопировать его в свою базу кода.

Список дочерних процессов (необходимо выполнить рекурсивно):

$"pgrep -P {parentId}"

Убить по процессу :

$"kill -TERM {processId}"

50
задан Sergey Grinev 20 December 2012 в 15:13
поделиться

3 ответа

Вы можете использовать временную шкалу для какого-либо вопроса:

Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        System.out.println("this is called every 5 seconds on UI thread");
    }
}));
fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
fiveSecondsWonder.play();

для фоновых процессов (которые ничего не делают для UI) вы можете использовать старый добрый java.util.Timer:

new Timer().schedule(
    new TimerTask() {

        @Override
        public void run() {
            System.out.println("ping");
        }
    }, 0, 5000);
82
ответ дан Sergey Grinev 22 August 2018 в 11:59
поделиться
  • 1
    Поскольку я понимаю, что дескриптор метода (событие ActionEvent) будет выполняться в основном потоке пользовательского интерфейса. Поэтому, если вычисление нового значения длинное, я могу попасть в проблемы? Мне нужно обновить простой текстовый статус, который проходит через сеть, поэтому любые проблемы с таймаутами блокируют этот поток - я прав? – Michał Króliczek 1 April 2012 в 18:11
  • 2
    правильно. Для рабочих потоков лучше использовать старый java.util.Timer. Я обновил ответ на примере. – Sergey Grinev 1 April 2012 в 18:58
  • 3
    Также вы можете найти javafx.animation.AnimationTimer – Sergey Grinev 26 June 2013 в 18:02
  • 4
    @SergeyGrinev Ваш первый пример не работает. Когда я запускаю его, на экране нет выхода, и программа просто завершается. – Kshitiz Sharma 27 August 2013 в 05:27
  • 5
    @KshitizSharma это код для приложения JavaFX UI, вы не можете просто запустить его из метода main (). См. Полный пример здесь: pastebin.com/tyLKxmB6 – Sergey Grinev 27 August 2013 в 21:14
  • 6
    – Hugo Zaragoza 13 October 2016 в 17:31

Я бы предпочел PauseTransition:

    PauseTransition wait = new PauseTransition(Duration.seconds(5));
    wait.setOnFinished((e) -> {
        /*YOUR METHOD*/
        wait.playFromStart();
    });
    wait.play();
6
ответ дан Marcel 22 August 2018 в 11:59
поделиться

Вот решение, использующее Java 8 и ReactFX . Предположим, что вы хотите периодически пересчитывать значение Label.textProperty().

Label label = ...;

EventStreams.ticks(Duration.ofSeconds(5))          // emits periodic ticks
    .supplyCompletionStage(() -> getStatusAsync()) // starts a background task on each tick
    .await()                                       // emits task results, when ready
    .subscribe(label::setText);                    // performs label.setText() for each result

CompletionStage<String> getStatusAsync() {
    return CompletableFuture.supplyAsync(() -> getStatusFromNetwork());
}

String getStatusFromNetwork() {
    // ...
}

По сравнению с решением Сергея вы не посвящаете весь поток получать статус из сети, а вместо этого используете общий поток пул для этого.

5
ответ дан Tomas Mikula 22 August 2018 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: