【问题标题】:Passing C# window handle to unmanaged code - Cross-thread exception将 C# 窗口句柄传递给非托管代码 - 跨线程异常
【发布时间】:2013-10-18 21:33:18
【问题描述】:

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

源的 Platform Invoke 在一次性更新中运行良好,当我使用自己的 Invoke 对其进行线程处理时,我知道类型都是正确的并且它正在正确编组。

主要问题是当我尝试线程化操作并将窗口句柄直接传递给非托管代码时,我得到了可怕的“跨线程操作无效”异常。

我了解问题所在,只是不太确定如何解决。那么,当非托管代码只需要窗口句柄时,如何使用委托和“BeginInvoke()”方法进行控制?甚至可以安排这个吗?

这是非托管库功能的 sn-p:

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# c++ multithreading pinvoke marshalling


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多