优化更新内存信息任务 (#5286)
This commit is contained in:
@@ -42,10 +42,7 @@ import org.jackhuang.hmcl.ui.FXUtils;
|
|||||||
import org.jackhuang.hmcl.ui.WeakListenerHolder;
|
import org.jackhuang.hmcl.ui.WeakListenerHolder;
|
||||||
import org.jackhuang.hmcl.ui.construct.*;
|
import org.jackhuang.hmcl.ui.construct.*;
|
||||||
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
|
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
|
||||||
import org.jackhuang.hmcl.util.Lang;
|
import org.jackhuang.hmcl.util.*;
|
||||||
import org.jackhuang.hmcl.util.Pair;
|
|
||||||
import org.jackhuang.hmcl.util.ServerAddress;
|
|
||||||
import org.jackhuang.hmcl.util.StringUtils;
|
|
||||||
import org.jackhuang.hmcl.util.javafx.BindingMapping;
|
import org.jackhuang.hmcl.util.javafx.BindingMapping;
|
||||||
import org.jackhuang.hmcl.util.javafx.PropertyUtils;
|
import org.jackhuang.hmcl.util.javafx.PropertyUtils;
|
||||||
import org.jackhuang.hmcl.util.javafx.SafeStringConverter;
|
import org.jackhuang.hmcl.util.javafx.SafeStringConverter;
|
||||||
@@ -56,34 +53,18 @@ import org.jackhuang.hmcl.util.platform.SystemInfo;
|
|||||||
import org.jackhuang.hmcl.util.platform.hardware.PhysicalMemoryStatus;
|
import org.jackhuang.hmcl.util.platform.hardware.PhysicalMemoryStatus;
|
||||||
import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
|
import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static org.jackhuang.hmcl.ui.FXUtils.stringConverter;
|
import static org.jackhuang.hmcl.ui.FXUtils.stringConverter;
|
||||||
import static org.jackhuang.hmcl.util.DataSizeUnit.GIGABYTES;
|
import static org.jackhuang.hmcl.util.DataSizeUnit.GIGABYTES;
|
||||||
import static org.jackhuang.hmcl.util.DataSizeUnit.MEGABYTES;
|
import static org.jackhuang.hmcl.util.DataSizeUnit.MEGABYTES;
|
||||||
import static org.jackhuang.hmcl.util.Lang.getTimer;
|
|
||||||
import static org.jackhuang.hmcl.util.Pair.pair;
|
import static org.jackhuang.hmcl.util.Pair.pair;
|
||||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||||
|
|
||||||
public final class VersionSettingsPage extends StackPane implements DecoratorPage, VersionPage.VersionLoadable, PageAware {
|
public final class VersionSettingsPage extends StackPane implements DecoratorPage, VersionPage.VersionLoadable, PageAware {
|
||||||
|
|
||||||
private static final ObjectProperty<PhysicalMemoryStatus> memoryStatus = new SimpleObjectProperty<>(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(SystemInfo.getPhysicalMemoryStatus()));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
getTimer().scheduleAtFixedRate(memoryStatusUpdateTask, 0, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final ReadOnlyObjectWrapper<State> state = new ReadOnlyObjectWrapper<>(new State("", null, false, false, false));
|
private final ReadOnlyObjectWrapper<State> state = new ReadOnlyObjectWrapper<>(new State("", null, false, false, false));
|
||||||
|
|
||||||
private AdvancedVersionSettingPage advancedVersionSettingPage;
|
private AdvancedVersionSettingPage advancedVersionSettingPage;
|
||||||
@@ -127,6 +108,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
private final IntegerProperty maxMemory = new SimpleIntegerProperty();
|
private final IntegerProperty maxMemory = new SimpleIntegerProperty();
|
||||||
private final BooleanProperty modpack = new SimpleBooleanProperty();
|
private final BooleanProperty modpack = new SimpleBooleanProperty();
|
||||||
|
|
||||||
|
private final ReadOnlyObjectProperty<PhysicalMemoryStatus> memoryStatus = UpdateMemoryStatus.memoryStatusProperty();
|
||||||
|
|
||||||
public VersionSettingsPage(boolean globalSetting) {
|
public VersionSettingsPage(boolean globalSetting) {
|
||||||
ScrollPane scrollPane = new ScrollPane();
|
ScrollPane scrollPane = new ScrollPane();
|
||||||
scrollPane.setFitToHeight(true);
|
scrollPane.setFitToHeight(true);
|
||||||
@@ -510,10 +493,7 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
cboProcessPriority.getItems().setAll(ProcessPriority.values());
|
cboProcessPriority.getItems().setAll(ProcessPriority.values());
|
||||||
cboProcessPriority.setConverter(stringConverter(e -> i18n("settings.advanced.process_priority." + e.name().toLowerCase(Locale.ROOT))));
|
cboProcessPriority.setConverter(stringConverter(e -> i18n("settings.advanced.process_priority." + e.name().toLowerCase(Locale.ROOT))));
|
||||||
|
|
||||||
memoryStatus.set(SystemInfo.getPhysicalMemoryStatus());
|
|
||||||
componentList.disableProperty().bind(enableSpecificSettings.not());
|
componentList.disableProperty().bind(enableSpecificSettings.not());
|
||||||
|
|
||||||
initMemoryStatusUpdateTask();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -809,4 +789,58 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag
|
|||||||
public ReadOnlyObjectProperty<State> stateProperty() {
|
public ReadOnlyObjectProperty<State> stateProperty() {
|
||||||
return state.getReadOnlyProperty();
|
return state.getReadOnlyProperty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class UpdateMemoryStatus extends Thread {
|
||||||
|
|
||||||
|
@FXThread
|
||||||
|
private static WeakReference<ObjectProperty<PhysicalMemoryStatus>> memoryStatusPropertyCache;
|
||||||
|
|
||||||
|
@FXThread
|
||||||
|
static ReadOnlyObjectProperty<PhysicalMemoryStatus> memoryStatusProperty() {
|
||||||
|
if (memoryStatusPropertyCache != null) {
|
||||||
|
var property = memoryStatusPropertyCache.get();
|
||||||
|
if (property != null) {
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectProperty<PhysicalMemoryStatus> property = new SimpleObjectProperty<>(PhysicalMemoryStatus.INVALID);
|
||||||
|
memoryStatusPropertyCache = new WeakReference<>(property);
|
||||||
|
new UpdateMemoryStatus(memoryStatusPropertyCache).start();
|
||||||
|
return property;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final WeakReference<ObjectProperty<PhysicalMemoryStatus>> memoryStatusPropertyRef;
|
||||||
|
|
||||||
|
UpdateMemoryStatus(WeakReference<ObjectProperty<PhysicalMemoryStatus>> memoryStatusPropertyRef) {
|
||||||
|
this.memoryStatusPropertyRef = memoryStatusPropertyRef;
|
||||||
|
|
||||||
|
setName("UpdateMemoryStatus");
|
||||||
|
setDaemon(true);
|
||||||
|
setPriority(Thread.MIN_PRIORITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (true) {
|
||||||
|
PhysicalMemoryStatus status = SystemInfo.getPhysicalMemoryStatus();
|
||||||
|
|
||||||
|
var memoryStatusProperty = memoryStatusPropertyRef.get();
|
||||||
|
if (memoryStatusProperty == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Controllers.isStopped())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Platform.runLater(() -> memoryStatusProperty.set(status));
|
||||||
|
|
||||||
|
try {
|
||||||
|
//noinspection BusyWait
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user