我有一个托管的c ++应用程序,我开始一个新线程来做一些事情并更新一些文本框,它在每个循环结束时循环和休眠。因为它在睡觉,我需要在新线程中使用它,因此UI不会崩溃。然后我意识到我需要调用创建UI的线程来访问文本框,但现在我回到主线程中,所以睡眠崩溃了。我该怎么做呢。
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);
}
}
}
答案 0 :(得分:0)
最佳选择可能会重构这一点,因此您的睡眠不会在SetText
方法中发生。您的后台线程可以使用一个执行睡眠的单独方法,然后调用正确的方法在循环中设置文本(一次一个文本框)。
通常,您应该使用Control::Invoke
时使用的方法尽可能短 - 它们应该只包含UI工作所需的逻辑,而不是其他功能。
话虽如此,在这种情况下,似乎System::Windows::Forms::Timer
更合适。您可以将时间间隔设置为300
,并在计时器的Tick
事件中一次更新一个文本框。