yuxue423 2023-11-07 10:11 采纳率: 50%
浏览 10
已结题

VISSIM二次开发“gdi+中发生的一般错误”

C#对VISSIM进行二次开发显示“应用程序发生了未经处理的异常,gdi+中发生的一般错误”。
代码背景是采用C#编写干线信号控制,设计信号配时更改、相位差更改。
代码前期正常运行,后面会弹出如下图的方框报错

img


,报错内容是“应用程序发生了未经处理的异常,gdi+中发生的一般错误”。然后代码还在运行,车辆和信号灯还在正常变化,但是VISSIM的界面“左下角”的仿真时间会卡主不变,路网也会卡住,如图

img


期初考虑是否代码复杂或是相位差改变导致的错误:于是测试定时控制代码(两个交叉口,无相位差,代码简单),结果前2330秒仍正常运行,在2330秒时报出同样错误。
请问大家有遇到过这种问题吗,解决办法是什么呢?
  • 写回答

1条回答 默认 最新

  • wanghui0380 2023-11-07 11:32
    关注

    GDI+错误,没有固定解。可以造成这种错误的原因几十条,连微软自己都折腾不清,所以就给了个“没有任何调试价值的” GDI+一般性错误。

    不过大多数是情况是 出现在频繁更新picbox这块。一般建议是能using就using,能dispose就dispose。这是我们一般能正常运行代码的常见处理。不过这东西还有一大堆完全解释不清楚情况的,反正当初mono开发组是完全不相信官方的,他们基本自己重新写的gdi+和dawing和图像处理库

    if (pictureBox1.Image != null)
    {
        pictureBox1.Image.Dispose();
    }
    pictureBox1.Image = newBitmap; // 
    
    using (Graphics g = Graphics.FromImage(bitmap))
    {
        // 在此处进行绘图操作
    }
    
    

    补充一下:我随便问了一下chartgpt,他回复了10种原因(嘿嘿,我知道的不只10种,但是这10种也算常见)

    1 资源泄漏:未正确释放图形资源(如 Image 对象、Graphics 对象)会导致内存泄漏,最终可能引发 GDI+ 错误。
    2 并发访问:多个线程同时访问相同的 GDI+ 对象可能会导致竞争条件和 GDI+ 错误。确保在多线程应用程序中使用适当的同步机制来管理图形资源。
    3 错误的图像格式:尝试加载或处理不支持的图像格式,或者使用不正确的图像格式设置,可能会引发 GDI+ 错误。确保图像的格式与您的操作兼容。
    4 内存耗尽:大规模图像处理或频繁创建销毁图像对象可能导致内存耗尽,从而触发 GDI+ 错误。
    5 无效的绘图操作:执行无效的绘图操作,如在没有有效图像或绘图上下文的情况下尝试绘制图形,可能会导致 GDI+ 错误。
    6 句柄泄漏:在使用 GDI+ 绘图时,可能会泄漏设备上下文句柄(HDC)。确保正确释放句柄,以避免 GDI+ 错误。
    7 捕获异常不当:如果不捕获 GDI+ 异常,它们可能会传播并导致应用程序崩溃。确保使用 try-catch 块来捕获并处理异常,以便更好地管理错误。
    8 不正确的颜色管理:在处理图像时,忽略颜色管理可能导致颜色失真和 GDI+ 错误。确保正确处理颜色管理。
    9 资源超限:Windows 有一些资源限制,如 GDI 对象和用户对象。如果您超过这些限制,可能会触发 GDI+ 错误。
    10 版本冲突:在某些情况下,使用不兼容的 GDI+ 版本可能导致错误。确保您的应用程序使用与操作系统兼容的 GDI+ 版本

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日
  • 创建了问题 11月7日