将 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);
        }
    }

将 C# 窗口句柄传递给非托管代码 - 跨线程异常

只能从主 UI 线程更改 UI 元素的属性。检查此网址,