gpt4 book ai didi

winforms - 如何在 Windows 窗体中创建 GDI 泄漏!

转载 作者:行者123 更新时间:2023-12-02 21:34:22 26 4
gpt4 key购买 nike

我正在调查大型应用程序中的 GDI 资源泄漏。为了进一步了解这些问题是如何发生的,我创建了一个非常小的应用程序,并故意使其“泄漏”。这是一个简单的用户控件,它将创建 100 个 Pen 对象:

public partial class TestControl : UserControl{    private List pens = new List();    public TestControl()    {        InitializeComponent();        for (int i = 0; i < 100; i++)        {            pens.Add(new Pen(new SolidBrush(Color.FromArgb(255, i * 2, i * 2, 255 - i * 2))));        }        this.Paint += new PaintEventHandler(TestControl_Paint);    }    void TestControl_Paint(object sender, PaintEventArgs e)    {        for (int i = 0; i < 100; i++)        {            e.Graphics.DrawLine(pens[i], 0, i, Width, i);        }    }}

但是,当我创建对象的实例并将其添加到表单时,使用 TaskManager 查看我的应用程序时,我当前看到约 37 个 GDI 对象。如果我反复向表单添加新的 TestObject 用户控件,我仍然只能看到大约 37 个 GDI 对象。

这是怎么回事!我认为 System.Drawing.Pen 的构造函数将使用 GDI+ API 创建一个新的 Pen,从而使用一个新的 GDI 对象。

我一定是疯了。如果我无法编写一个创建 GDI 对象的简单测试应用程序,我如何创建一个泄漏它们的测试应用程序!

任何帮助将不胜感激。

最诚挚的问候,科林·E。

最佳答案

GDI+ 是否使用 GDI 句柄?我不确定,尽管我在某处读到有一个依赖于裸 GDI 的 .NET System.Drawing 实现。

但是,也许您可​​以尝试使用 AQTime 等分析器来查找泄漏。

您如何确定您的大型应用程序正在泄漏 GDI 句柄?任务管理器中的计数是否很大?如果是这样,您总是使用 GDI+,还是同时使用 GDI?如果多次创建控件,您的测试应用程序 GDI 处理计数是否会增加?

关于winforms - 如何在 Windows 窗体中创建 GDI 泄漏!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com