【问题标题】:PerformClick() to four button simultaneously, parallel in Threads同时对四个按钮执行Click(),线程中并行
【发布时间】:2014-08-25 12:05:11
【问题描述】:

我有一个控制视频采集卡的程序。这张卡有几个输入,我的任务是编写一个从所有输入开始捕获的方法。不幸的是,在 SDK 中,我只能调用处理一个按钮的单击事件的方法。我有一个想法,编写几个线程,同时为指定输入呈现的每个按钮调用此方法。

下面是我的帖子。我打电话并给出选择开始的按钮的参考。

    private class StartThread
    {
        private static DateTime startTime; //arbitrary start time    

        private Button btnStart;

        public static void initializeTimer()
        {
            startTime = DateTime.Now.AddSeconds(5); //arbitrary start time
        }
        public StartThread(Button btnTmp)
        {
            this.btnStart = btnTmp;
        }
        public delegate void DelegateStandardPattern();
        public void doWork()
        {
            while (DateTime.Now < startTime) ;

            btnStart.PerformClick();
        }



    };

在那里我检查指定的开始按钮是否应该启动并创建线程:

private void btnStartAllClick(object sender, EventArgs e)
        {
            int i = 0, j = 0;
            List<Thread> listThreads = new List<Thread>();
            for (i = 0; i < miInstalledCardNum; i++)
            {
                for (j = 0; j < mCard[i].iDeviceNum; j++)
                {
                    if (mCard[i].Device[j].ChkBoxStartAll.Checked == true &&
                        mCard[i].Device[j].ChkBoxStartAll.Enabled == true)
                    {
                        StartThread tmpThread = new StartThread(mCard[i].Device[j].BtnStart);
                        listThreads.Add(new Thread(tmpThread.doWork));
                    }
                }
            }

            if(listThreads.Count > 0){
                StartThread.initializeTimer();
                foreach(Thread currentThread in listThreads)
                    currentThread.Start();
                foreach (Thread currentThread in listThreads)
                    currentThread.Join();

            }

         }

不幸的是,这个操作返回了一个异常:

Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

我试过女巫InvokeRequired

  if (this.InvokeRequired)
        {
            this.Invoke(
                new MethodInvoker(
                delegate() { ThreadSafeFunction(intVal, boolVal); }));
        }
        else
        {
            //use intval and boolval
        }

但我得到另一个错误:

不包含“调用”的定义,并且找不到接受“fmb_player_apl.MasterForm.StartThread”类型的第一个参数的扩展方法“调用”(您是否缺少 using 指令或程序集引用?)

我必须同时启动四个按钮,因为它会导致异步视频。

【问题讨论】:

  • btnStart 的点击事件处理函数是做什么的?你能把这段代码拉到一个单独的方法中并调用它吗?
  • 是的,我可以调用事件处理程序内部的方法,但同样的错误会进一步显示给我。该方法与 UI 有关,例如更改按钮的状态或启动另一个窗口。所以我被困在同一点上。有其他解决方案吗?在最坏的情况下,我开始按顺序调用按钮,然后在另一个程序中尝试同步我的视频,但不幸的是它给我带来了另一个问题,我想逃避。

标签: c# multithreading invoke


【解决方案1】:

不幸的是,在 SDK 中我只能调用处理一个按钮的点击事件的方法。

这听起来令人难以置信。您有控制 UI 的 SDK?那太糟了。这不是 SDK 应有的样子。找其他供应商提供您想做的任何事情。

在 UI 中并行做事根本不可能。即使 并行执行(这不会像您想象的那样工作),也没有 Windows 技术可以让他们构建 UI 以允许您并行执行。所有 UI 都通过让 UI 线程处理事件队列来工作......一个接一个地处理它们。

只是按顺序调用所有这些,中间没有任何东西对你来说足够快吗?因为这是你能做的最好的事情。

【讨论】:

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