PerformClick() до четырех кнопок одновременно, параллельно в потоках

У меня есть программа, которая контролирует карту захвата видео. И эта карта имеет несколько входов, и моя задача состоит в том, чтобы написать метод, который начинает захват со всех входов. К сожалению, в 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
        }

Но я получаю еще одну ошибку:

не содержит определения для 'Invoke' и не найден метод расширения 'Invoke', принимающий первый аргумент типа 'fmb_player_apl.MasterForm.StartThread' (вы пропустили директиву using или ссылку на сборку?)

Я должен начать четыре кнопки параллельно, потому что это вызывает асинхронное видео.

1 ответ

К сожалению, в SDK я могу вызвать только метод, который обрабатывает событие нажатия для одной кнопки.

Это звучит невероятно подозрительно. У вас есть SDK, который контролирует пользовательский интерфейс? Это ужасно. Это не то, что должен быть SDK. Получите другого поставщика того, что вы хотите сделать.

Делать вещи в пользовательском интерфейсе параллельно просто невозможно. Даже если вы делаете это параллельно (что не сработает, как вы выяснили), нет технологии Windows, которая позволила бы им создать пользовательский интерфейс, позволяющий вам делать это параллельно. Весь пользовательский интерфейс работает, когда поток пользовательского интерфейса работает с очередью событий... обрабатывая их один за другим.

Было бы достаточно просто вызвать их все по порядку без промежуточных событий? Потому что это лучшее, что ты можешь сделать.

Другие вопросы по тегам