我正在尝试使用VS2012在C ++ / CLI应用程序中编写多线程WinForm。
我知道只有UI线程可以更新控件,我一直在使用委托和调用方法。但是,在使用我在使用Invoke时看不到的BeginInvoke时,我遇到了内存访问问题。
代表职能:
public: delegate void pictureboxShowDelegate(int tChannelNumber,System::Windows::Forms::PictureBox^,System::Drawing::Bitmap^ colorImage);
被叫函数:
void DrawCVImageShow(int tChannelNumber, System::Windows::Forms::PictureBox^ PBox, System::Drawing::Bitmap^ b)
{
if(PBox->InvokeRequired)
{
pictureboxShowDelegate^ d = gcnew pictureboxShowDelegate(this,&MyForm::DrawCVImageShow);
PBox->Invoke(d,tChannelNumber,PBox,b);
}
else
{
System::Drawing::Graphics^ graphics = PBox->CreateGraphics();
System::Drawing::RectangleF rect(0,0,(float)PBox->Width,(float)PBox->Height);
graphics->DrawImage(b,rect);
}
}
如果以这种方式调用,它没有问题。 如果我用BeginInvoke替换Invoke,我会得到一个AccessViolationException。 显然,这与参数的垃圾收集有关,但我根本无法解决这个问题。
非常感谢任何帮助。
由于
答案 0 :(得分:0)
在我看来,DrawCVImageShow
之后调用DrawCVImageShow
的任何内容都是Disposing紧跟DrawCVImageShow
之后的位图。
如果是这种情况,有几种可能性:
DrawCVImageShow
负责处理位图,而不是调用DrawCVImageShow
。 (简单的解决方案,虽然可能不是工程解决方案中的最佳解决方案:创建位图的东西通常应该负责处理它,并且它使DrawCVImageShow
成为一种不那么通用的方法。)