我最近遇到了一个问题,即尝试使用视频捕获库和捕获卡实现实时视频捕获。非托管库在处理数据方面要比我手动处理得快得多,所以它似乎要走了。非托管库正在寻找控件更新的窗口句柄。
源的平台调用在一次性更新时工作正常,当我用自己的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);
}
}