From c8510bdd6d1789358ecc4e446137e61260ac69b1 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Wed, 22 May 2019 09:18:26 -0700 Subject: [PATCH] Clean up event handler leaks - Issue MatterHackers/MCCentral#5573 Investigate allocations on large GCode load and failure to release --- .../PartPreviewWindow/MainViewWidget.cs | 31 ++++++++++++++----- .../PartPreviewWindow/RunningTasksWidget.cs | 22 +++++++++---- .../View3D/MeshViewerWidget.cs | 1 + 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/MatterControlLib/PartPreviewWindow/MainViewWidget.cs b/MatterControlLib/PartPreviewWindow/MainViewWidget.cs index a52b71642..1f6c094b3 100644 --- a/MatterControlLib/PartPreviewWindow/MainViewWidget.cs +++ b/MatterControlLib/PartPreviewWindow/MainViewWidget.cs @@ -545,15 +545,23 @@ namespace MatterHackers.MatterControl.PartPreviewWindow MinimumSize = new Vector2(120, theme.TabButtonHeight) }; - printerTab.CloseClicked += (s, e) => + void Tab_CloseClicked(object sender, EventArgs args) { ApplicationController.Instance.ClosePrinter(printer); - }; + } + void Widget_Closed(object sender, EventArgs args) + { + // Unregister listeners + printerTab.CloseClicked -= Tab_CloseClicked; + printerTab.Closed -= Widget_Closed; + printer.Settings.SettingChanged -= Printer_SettingChanged; + } + + // Register listeners printer.Settings.SettingChanged += Printer_SettingChanged; - - // Unregister listener on Tab close - printerTab.Closed += (s, e) => printer.Settings.SettingChanged -= Printer_SettingChanged; + printerTab.CloseClicked += Tab_CloseClicked; + printerTab.Closed += Widget_Closed; // Add printer tab tabControl.AddTab(printerTab); @@ -609,10 +617,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow tabControl.AddTab(partTab); - partTab.CloseClicked += (s, e) => + void Tab_CloseClicked(object sender, EventArgs args) { ApplicationController.Instance.Workspaces.Remove(workspace); - }; + } + + void Widget_Closed(object sender, EventArgs args) + { + partTab.CloseClicked -= Tab_CloseClicked; + partTab.Closed -= Widget_Closed; + } + + partTab.CloseClicked += Tab_CloseClicked; + partTab.Closed += Widget_Closed; return partTab; } diff --git a/MatterControlLib/PartPreviewWindow/RunningTasksWidget.cs b/MatterControlLib/PartPreviewWindow/RunningTasksWidget.cs index 8fc92bdf9..7e9aeb066 100644 --- a/MatterControlLib/PartPreviewWindow/RunningTasksWidget.cs +++ b/MatterControlLib/PartPreviewWindow/RunningTasksWidget.cs @@ -27,6 +27,7 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; using System.Collections.Generic; using System.Linq; using MatterHackers.Agg; @@ -67,14 +68,23 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; this.AddChild(pendingTasksList); - var tasks = ApplicationController.Instance.Tasks; + // Register listeners + ApplicationController.Instance.Tasks.TasksChanged += this.Tasks_TasksChanged; - tasks.TasksChanged += (s, e) => - { - RenderRunningTasks(theme, tasks); - }; + this.RenderRunningTasks(theme, ApplicationController.Instance.Tasks); + } - RenderRunningTasks(theme, tasks); + private void Tasks_TasksChanged(object sender, EventArgs e) + { + this.RenderRunningTasks(theme, ApplicationController.Instance.Tasks); + } + + public override void OnClosed(EventArgs e) + { + // Unregister listeners + ApplicationController.Instance.Tasks.TasksChanged -= this.Tasks_TasksChanged; + + base.OnClosed(e); } private void RenderRunningTasks(ThemeConfig theme, RunningTasksConfig tasks) diff --git a/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs b/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs index 76830781f..f2d081378 100644 --- a/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/MatterControlLib/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -66,6 +66,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private readonly List drawables = new List(); private readonly List itemDrawables = new List(); + private bool emulatorHooked; private long lastEmulatorDrawMs; private readonly Mesh emulatorNozzleMesh = PlatonicSolids.CreateCube(1, 1, 10);