PerformClick()同时执行四个按钮,在线程中并行

本文关键字:线程 并行 按钮 执行 PerformClick 四个 | 更新日期: 2023-09-27 18:19:16

我有一个控制视频采集卡的程序。这张卡有几个输入,我的任务是写一个方法从所有输入开始捕获。不幸的是,在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.

I tried witch InvokeRequired:

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

但是我得到另一个错误:

不包含'Invoke'的定义,也没有扩展方法'Invoke'接受类型为' fmb_player_api . masterform '的第一个参数。可以找到StartThread(您是否缺少using指令或程序集引用?)

我必须开始四个按钮并行,因为它导致异步视频。

PerformClick()同时执行四个按钮,在线程中并行

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

听起来很可疑。你有一个控制UI的SDK ?这是可怕的。这不是SDK应该有的样子。找另一个你想做的提供者。

在UI 中并行执行是不可能的。即使并行执行(这不会像你想象的那样工作),也没有windows技术允许他们构建一个UI来允许你并行执行。所有UI的工作原理是有一个UI线程在一个事件队列上工作……一个接一个处理。

对你来说,仅仅按顺序调用它们而不包含中间的东西是否足够快?因为这是你能做的最好的事情。