【问题标题】:adding Panel to form on different thread在不同的线程上添加面板以形成
【发布时间】:2013-06-24 09:05:51
【问题描述】:

我有一个面板,其中包含一个活动 x 组件来显示相机流。这是外部代码。由于相机驱动程序的原因,此面板只能运行 STA 线程。

如何在另一个线程上创建的表单上显示此面板? 例如:

[STAThread]
        public Main()
        {

            Panel display = new Panel();

            Thread form = new Thread(()=>
            {
                Form displayForm = new Form();
                displayForm.Show();
                displayForm.Controls.Add(display);
            });
            form.Start();

            CameraComponent axCamera = new CameraComponent(); //create new camera component active x component
            display.Controls.Add(axCamera);
        }

但这会引发异常:display.Controls.Add(axCamera); 异常:跨线程操作无效:控件''从创建它的线程以外的线程访问。

【问题讨论】:

    标签: c# multithreading winforms controls


    【解决方案1】:

    您必须调用该操作:

    Thread form = new Thread(()=>
    {
        Form displayForm = new Form();
        displayForm.Show();
        display.Invoke((MethodInvoker)delegate { displayForm.Controls.Add(display); });
    });
    

    说实话,我看不出你有什么理由要这样做。这是一个非常简单快速的操作,你应该在 UI 线程上做而不是创建一个新的。

    【讨论】:

    • 显示的代码是实际代码的简单版本,在实际代码中用户可以在不同的窗体上创建一个摄像头,所有这些摄像头面板必须在同一个线程上
    • 啊,我明白了,无论如何我的解决方案应该对你有用:)
    • 我仍然遇到同样的异常
    • 出现了小错误,请重试:)
    • 它现在似乎可以工作了,但现在又出现了另一个问题,异常是:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”现在,当调用尝试执行时,我已经检查了句柄,但显示的句柄从未在执行调用的线程上创建。这怎么可能?如何确保我可以从所有线程访问它?
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2015-10-24
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多