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

时间:2013-10-18 21:33:18

标签: c# c++ multithreading pinvoke marshalling

我最近遇到了一个问题,即尝试使用视频捕获库和捕获卡实现实时视频捕获。非托管库在处理数据方面要比我手动处理得快得多,所以它似乎要走了。非托管库正在寻找控件更新的窗口句柄。

源的平台调用在一次性更新时工作正常,当我用自己的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);
        }
    }

1 个答案:

答案 0 :(得分:0)

您只能从主UI线程更改UI元素的属性。检查此url