.net - DotNET 应用程序中的 GDI 句柄

标签 .net memory-leaks count gdi handle

我的纯 DotNET 库作为插件在非托管桌面应用程序中运行。我收到了稳定的(虽然低)崩溃报告流,这些报告似乎表明 GDI 句柄存在问题(错误消息中的字体等。恢复为系统字体,各种控件的显示崩溃,不久后发生大规模崩溃) )。

我的窗体几乎没有控件,但我在用户控件中进行了大量 GDI+ 绘图。有什么好方法可以知道我正在使用多少个句柄,甚至泄漏了多少个句柄?

谢谢, 大卫

最佳答案

GDIView 开头从Ray Vega的回答中,我发现this tip :

[DllImport("User32")] 
extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);

  public static void GetGuiResourcesGDICount()      
  { 
      //Return the count of GDI objects.          
      Console.WriteLine("GDICount"+GetGuiResources(System.Diagnostics.Process.GetCurrentProcess().Handle, 0));      
  }

  private void button1_Click(object sender, System.EventArgs e)
  {
      GetGuiResourcesGDICount();
  }

GDIView 通知字体对象正在泄漏;然后,我将对 GetGuiResources 的调用添加到我们的日志记录代码中,以检测触发对象创建的时间点。

在我们的例子中,当Label控件的父UserControl隐藏在背景窗口中时,我们更新了Label控件的文本。这会导致 GDI 泄漏字体句柄。为了解决这个问题,我们更改了逻辑,除非标签当前在屏幕上可见,否则不更新标签。为了确定它是否可见,我们记录了 UserControl 上次绘制的时间。

关于.net - DotNET 应用程序中的 GDI 句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2483011/

相关文章:

c# - 从库代码中发现程序集

.net - 禁用 datagridview 上的编辑,但仍允许突出显示以复制和粘贴单元格

java - getMethod 正在缓存并导致内存泄漏

sql - 一列中的 COUNT 个 DISTINCT 项目

MySQL COUNT() 和 FIND_IN_SET()

sql - 在 SQL Server 中计算日期和今天之间的天数?

c# - 如何管理 WinForms 应用程序的大型界面?

.net - .NET 的 RESTful Web 服务教程

java - Jersey 2.x 通过简单的 POST 调用(多线程)泄漏内存(终结器)

objective-c - NSString 复制内存泄漏