【问题标题】:GDI+ LockBits()/UnLockBits() ExceptionGDI+ LockBits()/UnLockBits() 异常
【发布时间】:2011-12-21 05:47:56
【问题描述】:

我的程序是用 C# 编写的,并在低级别使用位图进行操作。一切正常,但有时(非常罕见,但稳定)会出现“通用 GDI+ 异常”异常,并且很难重现这种情况。

函数 LockBits() 和 UnLockBits() 发生异常。它包含错误代码“-2147467259”。在 GDI+ 的语言中,它是方法 GdipBitmapLockBits 并返回代码 7 或 1。

什么样的原因可能会导致这种情况?

任何答案都非常感谢。

【问题讨论】:

  • 您能粘贴一个代码 sn-p 显示您的代码吗?
  • 位图数据的底层存储有问题。可能被锁定(避免线程),可能是已释放的内存流,可能是虚拟内存不足。
  • 你有读/写位图的权限吗?
  • @HansPassant 我试图重现异常,用大量字节填充内存并循环 lockbits() 和 unlockbits() 数千次,没有发生异常。看起来这种方法根本不使用内存。处理位图流会导致 InvalidOperationException,不是通用的。

标签: c# bitmap gdi+


【解决方案1】:

我已经调查过这个问题,似乎它可能与线程有关。 我不确定是什么真正导致了这个问题并且没有证据,但是在整个代码中设置锁定之后,问题似乎已经消失了。

【讨论】:

    【解决方案2】:

    GDI+ 对象不是线程安全的,在不同步的情况下从多个线程使用它们肯定会导致崩溃。为了完整起见,我想补充一点,可以在释放位图之前释放支持 GDI+ 位图的内存,在这种情况下,尝试使用位图时会获得无效访问。仅当您自己分配像素数据并使用带有指向数据的指针的构造函数时才会发生这种情况,例如:http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多