Как мне вызвать симулятор логов в реальном времени, который получает информацию из нескольких потоков - PullRequest
0 голосов
/ 31 марта 2019

Я полностью осознаю, что об этом уже спрашивали, но моя проблема заключается в как вызвать эту конкретную функцию.Итак, позвольте мне представить основную проблему: я должен сделать журнал для добавления клиентов в очереди.

Я пробовал несколько версий методов, которые имеют runnables и Platform.runLater (...), чтобырешить эту проблему, но он обновляет журнал только после завершения процесса.Так как эти методы работали для других людей, я начинаю думать, что использую их неправильно.Вот что я написал:

Здесь я объявил пользовательский интерфейс и использовал панель, в которой класс

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scheduler.border.setCenter(Scheduler.scroll);
        Scene scene = new Scene(Scheduler.border, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
        Scheduler scheduler = new Scheduler();
        scheduler.run();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

Runnable.Он отображается в консоли каждую секунду, а графический интерфейс - через 10 секунд.Второй метод - это тот, который должен решить мою проблему: создание потока FX, позволяющего мне изменять пользовательский интерфейс.И это происходит, но не в то время.

class Scheduler implements Runnable{

    private static final int numberQueues = 3;
    static final int serviceTime = 10;
    static volatile int currentTime;
    public static BorderPane border = new BorderPane();
    public static Pane scroll = new Pane();
    public static TextArea logList = new TextArea(" Starting Logs...\n");

    public Scheduler() {currentTime = 0;}

    @Override
    public void run() {
        while (serviceTime > currentTime) {
            currentTime += 1;
            try {
                writeToActivityLog(currentTime + " | Customer at queue" + currentTime % numberQueues);
                System.out.println(currentTime + " | Customer at queue" + currentTime % numberQueues);
                Thread.sleep(1000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
        static public void writeToActivityLog(String logEntry){

        class Threade implements Runnable {
            private String logEntry;

            private Threade(String logEntry){
                this.logEntry = logEntry;
            }

            @Override
            public void run() {
                logList.appendText(logEntry);
                scroll.getChildren().removeAll();
                scroll.getChildren().addAll(logList);
            }
        }
        String updatedLog = logList.getText()+ logEntry;
        Threade thread = new Threade(updatedLog);
        Platform.runLater(thread);
    }
}

Итак, как я уже говорил ранее, я хочу, чтобы журналы генерировались по мере выполнения потоков, а не только после их завершения.Но это единственный способ получить их.Кроме того, окно замирает, оно щелкает во время процесса потока, но это нормально после завершения потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...