Вызвать Windows Form Thread and Sleeping

У меня есть управляемое приложение на C++, которое я запускаю в новом потоке, чтобы что-то делать, и обновляю некоторые текстовые поля, оно зацикливается и спит в конце каждого цикла. Из-за того, что он спал, мне нужно было поместить его в новый поток, чтобы пользовательский интерфейс не падал. Тогда я понял, что мне нужно вызвать поток, который создал пользовательский интерфейс, для доступа к текстовым полям, но теперь я снова в основном потоке, поэтому спящий сбой. Как я должен подойти к этому.

private: System::Void buttonStartCamera_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             ThreadStart^ threadStart = gcnew ThreadStart(this, &UserInterface::SetText);
             Thread^ newThread = gcnew Thread(threadStart);
             newThread->Start();
         }



    void SetText()
    {
        if (this->textBoxCameraOneX->InvokeRequired)
        {
            MyDel^ del = gcnew MyDel(this, &UserInterface::SetText);
            this->Invoke(del);
        }
        else 
        {
            int count  = 0;
            srand (time(NULL));

            for (count = 0; count < 20; ++count)
            {
                for each (Camera^ camera in cameraList)
                {
                    textBoxCameraOneX->Text = count.ToString();

                }

                Sleep(300);
            }
        }
    }

1 ответ

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

В общем, вы должны сохранить методы, которые вы используете с Control::Invoke как можно короче - они должны включать только логику, необходимую для работы вашего пользовательского интерфейса, а не другие функциональные возможности.

Это, как говорится, в этом случае кажется System::Windows::Forms::Timer было бы более уместным. Вы можете установить интервал в 300и обновите текстовое поле по одному в таймере Tick событие.

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