0

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

源的 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);
        }
    }
4

1 回答 1

0

You can only change properties on UI elements from the main UI thread. Check this url,

于 2013-10-21T12:50:04.877 回答