调用Windows窗体线程和休眠

时间:2013-03-20 21:06:42

标签: multithreading managed-c++ invokerequired

我有一个托管的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);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

最佳选择可能会重构这一点,因此您的睡眠不会在SetText方法中发生。您的后台线程可以使用一个执行睡眠的单独方法,然后调用正确的方法在循环中设置文本(一次一个文本框)。

通常,您应该使用Control::Invoke时使用的方法尽可能短 - 它们应该只包含UI工作所需的逻辑,而不是其他功能。

话虽如此,在这种情况下,似乎System::Windows::Forms::Timer更合适。您可以将时间间隔设置为300,并在计时器的Tick事件中一次更新一个文本框。