我最近遇到了一个问题,尝试使用视频捕获库和捕获卡实现实时视频捕获。非托管库处理数据的速度比我手动处理的快得多,所以它似乎是要走的路。非托管库正在寻找要更新的控件的窗口句柄。
源的 Platform Invoke 在一次性更新中运行良好,当我使用自己的 Invoke 对其进行线程处理时,我知道类型都是正确的并且它正在正确编组。
主要问题是,当我尝试线程化操作并将窗口句柄直接传递给非托管代码时,我得到了可怕的“跨线程操作无效”异常。
我理解这个问题,只是不太确定如何解决它。那么,当非托管代码只需要窗口句柄时,如何使用委托和“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);
}
}