2013-03-20 101 views
0

我有一個託管的C++應用程序,我開始一個新的線程來做一些東西,並更新一些文本框,它循環和睡在每個循環的結尾。由於它睡覺,我需要在一個新的線程,所以用戶界面不會崩潰。然後我意識到我需要調用創建用戶界面來訪問文本框的線程,但是現在我回到了主線程,所以睡眠崩潰了。我應該如何解決這個問題。調用Windows窗體線程和睡眠

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

你爲什麼用這個線程?設置20個文本框在UI線程中首先執行得更快...... – 2013-03-20 21:08:18

+0

由於sleep()崩潰了UI – ThingWings 2013-03-20 21:16:46

回答

0

最好的選擇很可能會重構這個,所以你的睡眠不會發生在SetText方法中。您的後臺線程可以使用執行睡眠的單獨方法,然後調用正確的方法在循環中設置文本(一次一個文本框)。

一般來說,您應該儘量縮短使用Control::Invoke的方法 - 它們應該只包含UI工作所需的邏輯,而不包含其他功能。

這就是說,在這種情況下,它似乎是一個System::Windows::Forms::Timer會更合適。您可以將間隔設置爲300,並在計時器的Tick事件中一次更新一個文本框。