gpt4 book ai didi

.net - 使用 Graphics.DrawArc 的可重现崩溃

转载 作者:行者123 更新时间:2023-12-04 15:13:07 24 4
gpt4 key购买 nike

我们的软件呈现技术图纸。一个特定的绘图使应用程序每次都因 OutOfMemoryException 而崩溃。经调查,似乎没有什么异常;该应用程序没有请求大量内存,也没有使用很多句柄。我尝试捕捉异常并且应用程序完成了绘图而没有抛出另一个。事实上,总是只有一个 OutOfMemoryException,而且总是同一个图形基元导致它。

以下代码是导致此特定崩溃所需的最低要求。似乎图像大小、笔样式和坐标的确切组合导致了异常。将坐标四舍五入到小数点后三位会使其消失,就像缩小图形尺寸或使用笔而不用划线一样。

using (Bitmap b = new Bitmap(200, 200))
{
using (Graphics g = Graphics.FromImage(b))
{
using (Pen p = new Pen(Color.Black))
{
p.DashPattern = new float[]{10.0f, 2.0f};

RectangleF r = new RectangleF(
BitConverter.ToSingle(new byte[]{0xD3, 0x56, 0xB3, 0x42}, 0),
BitConverter.ToSingle(new byte[]{0x87, 0x2D, 0x17, 0x43}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0));
float st = BitConverter.ToSingle(new byte[]{0x6B, 0xF6, 0x1A, 0x42}, 0);
float sw = BitConverter.ToSingle(new byte[]{0x6D, 0x33, 0x4F, 0x40}, 0);

g.DrawArc(p, r, st, sw);
}
}
}

在这种情况下,创建解决方法并不复杂,但我想知道是否有人对此有解释。

最佳答案

System.Drawing 是 GDI+ 的包装器,GDI+ 是一个比 .NET 发布早很多年的非托管库。它有一个典型的 C api 问题,错误报告相当差。 GDI+ 只有 20 个不同的错误代码,对于这么大的代码块来说并不多。它们也是非常不透明的,特别是 Status::GenericError。一个非常常见的错误,对于许多没有共同点的可能错误条件返回。

System.Drawing 几乎无法使这些错误代码更具描述性,因为它们在设计上不是描述性的。 Status::OutOfMemory 也符合这种模式。它几乎无能为力,但会生成一个托管异常,这意味着同样的事情。遗憾的是,这也不是一个好的选择,因为 OutOfMemoryException 在 .NET 中非常具体。

这里有很多损失,几乎没有获胜的方法。您只需要从表面上看待 GDI+ 糟糕的错误报告并解决问题。在这种情况下,避免将虚线笔用于非常小的弧线很可能会解决您的问题。无论如何,您都看不到破折号图案。

关于.net - 使用 Graphics.DrawArc 的可重现崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937057/

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