From 78e15d130bcf49b6e9a63def44fcbc85aa959ced Mon Sep 17 00:00:00 2001 From: Haowei Wen Date: Mon, 30 Dec 2024 20:14:04 +0800 Subject: [PATCH] Update memory status every 1s, fix #3440 This commit also fixes Lang.getTimer() returns a non-daemon Timer, preventing Java from exiting after closing the launcher. --- .../hmcl/ui/versions/VersionSettingsPage.java | 20 ++++++++++++++++++- .../java/org/jackhuang/hmcl/util/Lang.java | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index c0b6bbd8c..17b6a3512 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -57,10 +57,27 @@ import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; +import static org.jackhuang.hmcl.util.Lang.getTimer; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class VersionSettingsPage extends StackPane implements DecoratorPage, VersionPage.VersionLoadable, PageAware { + + private static final ObjectProperty memoryStatus = new SimpleObjectProperty<>(OperatingSystem.PhysicalMemoryStatus.INVALID); + private static TimerTask memoryStatusUpdateTask; + private static void initMemoryStatusUpdateTask() { + FXUtils.checkFxUserThread(); + if (memoryStatusUpdateTask != null) + return; + memoryStatusUpdateTask = new TimerTask() { + @Override + public void run() { + Platform.runLater(() -> memoryStatus.set(OperatingSystem.getPhysicalMemoryStatus())); + } + }; + getTimer().scheduleAtFixedRate(memoryStatusUpdateTask, 0, 1000); + } + private final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(new State("", null, false, false, false)); private AdvancedVersionSettingPage advancedVersionSettingPage; @@ -102,7 +119,6 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag private final BooleanProperty navigateToSpecificSettings = new SimpleBooleanProperty(false); private final BooleanProperty enableSpecificSettings = new SimpleBooleanProperty(false); private final IntegerProperty maxMemory = new SimpleIntegerProperty(); - private final ObjectProperty memoryStatus = new SimpleObjectProperty<>(OperatingSystem.PhysicalMemoryStatus.INVALID); private final BooleanProperty modpack = new SimpleBooleanProperty(); public VersionSettingsPage(boolean globalSetting) { @@ -470,6 +486,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag memoryStatus.set(OperatingSystem.getPhysicalMemoryStatus()); componentList.disableProperty().bind(enableSpecificSettings.not()); + + initMemoryStatusUpdateTask(); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java index b0be0988c..85001ba8c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java @@ -389,7 +389,7 @@ public final class Lang { public static synchronized Timer getTimer() { if (timer == null) { - timer = new Timer(); + timer = new Timer(true); } return timer; }