将 C# 窗口句柄传递给非托管代码 - 跨线程异常
本文关键字:线程 异常 非托管代码 窗口句柄 | 更新日期: 2023-09-27 18:36:10
我最近遇到了一个问题,尝试使用视频捕获库和捕获卡实现实时视频捕获。 非托管库处理数据的速度比我手动处理要快得多,所以这似乎是要走的路。 非托管库正在寻找要更新的控件的窗口句柄。
源代码的平台调用在一次性更新上工作正常,当我使用自己的调用对其进行线程化时,因此我知道类型都是正确的,并且它正在正确封送。
主要问题是,当我尝试线程操作并将窗口句柄直接传递给非托管代码时,我得到可怕的"跨线程操作无效"异常。
我理解这个问题,只是不太确定如何解决它。 那么,当非托管代码只需要窗口句柄时,如何在控件上使用委托和"BeginInvoke()"方法? 甚至有可能安排这个吗?
下面是非托管库功能的代码片段:
class Video
{
[DllImport("video.dll", EntryPoint = "imagePlot", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
private static extern int imagePlot(IntPtr windowHandle, byte[] imageBuffer);
private PictureBox _control;
public Video(PictureBox control)
{
_control = control;
}
public void CaptureAndUpdate()
{
// capture video
byte[] video = Capture();
// plot video
imagePlot(_control.Handle, video);
}
}
只能从主 UI 线程更改 UI 元素的属性。检查此网址,