Clean up event handler leaks

- Issue MatterHackers/MCCentral#5573
Investigate allocations on large GCode load and failure to release
This commit is contained in:
John Lewin 2019-05-22 09:18:26 -07:00
parent f678cd688b
commit c8510bdd6d
3 changed files with 41 additions and 13 deletions

View file

@ -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;
}

View file

@ -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)

View file

@ -66,6 +66,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private readonly List<IDrawable> drawables = new List<IDrawable>();
private readonly List<IDrawableItem> itemDrawables = new List<IDrawableItem>();
private bool emulatorHooked;
private long lastEmulatorDrawMs;
private readonly Mesh emulatorNozzleMesh = PlatonicSolids.CreateCube(1, 1, 10);