diff --git a/gui/builtinShipBrowser/pfListPane.py b/gui/builtinShipBrowser/pfListPane.py index a6bca93c6..faddcfecf 100644 --- a/gui/builtinShipBrowser/pfListPane.py +++ b/gui/builtinShipBrowser/pfListPane.py @@ -163,6 +163,10 @@ def RemoveWidget(self, child): def RemoveAllChildren(self): for widget in self._wList: widget.Destroy() + # this forces the garbage collector to work properly by removing dangling references to objects which are still alive, otherwise widget cannot be gc-ed eventually causing GDI id exhaustion and crash + for i in widget.__dict__.keys(): + widget.__dict__[i] =None + del widget self.Scroll(0, 0) self._wList = [] diff --git a/gui/utils/gdi.py b/gui/utils/gdi.py new file mode 100644 index 000000000..bfa1e8cc1 --- /dev/null +++ b/gui/utils/gdi.py @@ -0,0 +1,32 @@ +import gc +from ctypes import * +from collections import defaultdict +import os +def gdiReport(desc=''): + PH = windll.kernel32.OpenProcess(0x400, 0, os.getpid()) + numGdi = windll.user32.GetGuiResources(PH, 0) + windll.kernel32.CloseHandle(PH) + print (f'{desc}, {numGdi}') + + +last = None +def output_memory(): + global last + d = defaultdict(int) + for o in gc.get_objects(): + name = type(o).__name__ + if name == 'Bitmap': + del o + d[name] += 1 + + items = d.items() + items = sorted(items,key=lambda x:x[1]) + print('------') + for key, value in items: + if last is not None: + if value -last[key] !=0: + print(f'{key} {value - last[key]}, {value}') + else: + print( key, value) + + last = d