Вызвать 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
событие.