我有一个有几个敌人的游戏,每个都在自己的线程中运行以进行移动和绘图。敌人在Panel上绘制,因此他们的线程必须访问Panel的Graphics。我使用CreateGraphics
保护了Lock
来电,当我想ReleaseHdc
Panel的图形时,我得到了一个 System.ArgumentException ,即使我调用{{ 1}} - 没有任何参数的方法。
这是相关代码(ReleaseHdc
是作为静态变量传递的Panel引用并指向正确的控件):
p
考虑到我需要在自己的线程中将每个元素绘制到同一个面板上的多线程访问,有没有人知道为什么我会收到此错误和/或如何修复它?
[编辑]
使用//Member region
internal Bitmap Img = new Bitmap(Image.FromFile(@"Enemy.png"), Size);
internal static readonly object _Lock = new object();
//from enemy's custom Move() method
lock (_Lock)
{
Graphics gfx = p.CreateGraphics();
gfx.DrawImage(Img, Location);
gfx.ReleaseHdc(); // gfx.Dispose() works here
}
代替gfx.Dispose()
就可以了。
结果虽然不令人满意,因为我得到一个非常不稳定的图像与闪烁的敌人。这可能是经常重复绘制它们而与我的问题无关的问题 - 或者这个问题与我如何处理多个线程之间有联系?
答案 0 :(得分:0)
如果您打算致电gfx.GetHdc()
,是否应该致电gfx.ReleaseHdc()
?
我认为您的代码应如下所示:
lock (_Lock)
{
using (var gfx = p.CreateGraphics())
{
gfx.DrawImage(Img, Location);
}
}
我也发现对CreateGraphics()
的调用本身就有点怀疑。我希望Graphics
对象提供到绘图代码,而不是通过创建。