From d30195560947c0aaa2ed41e6a48c93bfecc94436 Mon Sep 17 00:00:00 2001 From: zznty <94796179+zznty@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:52:10 +0700 Subject: [PATCH] move ui lifetime to a manager for better lifetime control --- Torch.Server/Initializer.cs | 24 ++++--------------- Torch.Server/Managers/UiManager.cs | 37 ++++++++++++++++++++++++++++++ Torch.Server/TorchServer.cs | 2 ++ Torch/Plugins/AssemblyRewriter.cs | 3 ++- Torch/TorchBase.cs | 5 ++++ 5 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 Torch.Server/Managers/UiManager.cs diff --git a/Torch.Server/Initializer.cs b/Torch.Server/Initializer.cs index dff1a4a..4d007d5 100644 --- a/Torch.Server/Initializer.cs +++ b/Torch.Server/Initializer.cs @@ -93,27 +93,11 @@ namespace Torch.Server #endif _server.Init(); - - var uiThread = new Thread(() => - { - var ui = new TorchUI(_server); - - SynchronizationContext.SetSynchronizationContext( - new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)); - - ui.ShowDialog(); - }); - - uiThread.SetApartmentState(ApartmentState.STA); - uiThread.Start(); - - if (Config.Autostart || Config.TempAutostart) - { - Config.TempAutostart = false; - _server.Start(); - } - uiThread.Join(); + if (!Config.Autostart && !Config.TempAutostart) return; + + Config.TempAutostart = false; + _server.Start(); } } diff --git a/Torch.Server/Managers/UiManager.cs b/Torch.Server/Managers/UiManager.cs new file mode 100644 index 0000000..698c239 --- /dev/null +++ b/Torch.Server/Managers/UiManager.cs @@ -0,0 +1,37 @@ +using System.Threading; +using System.Windows.Threading; +using JetBrains.Annotations; +using Torch.Managers; + +namespace Torch.Server.Managers; + +public class UiManager(TorchServer torchInstance) : Manager(torchInstance) +{ + [CanBeNull] private Thread _uiThread; + [CanBeNull] private Dispatcher _dispatcher; + + public override void Attach() + { + _uiThread = new Thread(() => + { + var ui = new TorchUI(torchInstance); + + _dispatcher = Dispatcher.CurrentDispatcher; + + SynchronizationContext.SetSynchronizationContext( + new DispatcherSynchronizationContext(_dispatcher)); + + ui.ShowDialog(); + }); + + _uiThread.SetApartmentState(ApartmentState.STA); + _uiThread.Start(); + } + + public override void Detach() + { + _dispatcher?.InvokeShutdown(); + if (Thread.CurrentThread != _uiThread) + _uiThread?.Join(); + } +} \ No newline at end of file diff --git a/Torch.Server/TorchServer.cs b/Torch.Server/TorchServer.cs index efd46ce..fb24a21 100644 --- a/Torch.Server/TorchServer.cs +++ b/Torch.Server/TorchServer.cs @@ -56,6 +56,8 @@ namespace Torch.Server if (config.EntityManagerEnabled) AddManager(new EntityControlManager(this)); AddManager(new RemoteAPIManager(this)); + if (!ApplicationContext.Current.IsService && !config.NoGui) + AddManager(new UiManager(this)); var sessionManager = Managers.GetManager(); sessionManager.AddFactory(_ => new MultiplayerManagerDedicated(this)); diff --git a/Torch/Plugins/AssemblyRewriter.cs b/Torch/Plugins/AssemblyRewriter.cs index bfa3fea..b0352c4 100644 --- a/Torch/Plugins/AssemblyRewriter.cs +++ b/Torch/Plugins/AssemblyRewriter.cs @@ -65,7 +65,8 @@ internal static class AssemblyRewriter { using var assembly = AssemblyDefinition.ReadAssembly(inputStream, new() { - AssemblyResolver = resolver + AssemblyResolver = resolver, + ReadSymbols = true }); foreach (var fieldDefinition in FindAllToRewrite(assembly.MainModule)) { diff --git a/Torch/TorchBase.cs b/Torch/TorchBase.cs index 4fea0df..4f833ce 100644 --- a/Torch/TorchBase.cs +++ b/Torch/TorchBase.cs @@ -292,16 +292,21 @@ namespace Torch public void Dispose() { } + + private bool _disposed = false; /// public virtual void Destroy() { + if (_disposed) return; Game.SignalDestroy(); if (!Game.WaitFor(VRageGame.GameState.Destroyed)) Log.Warn("Failed to wait for the game to be destroyed"); Game = null; Managers.Detach(); + + _disposed = true; } #endregion