0

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

1 回答 1

0

最好的选择可能是重构这个,这样你的睡眠就不会出现在SetText方法中。您的后台线程可以使用一种单独的方法来执行睡眠,然后调用适当的方法在循环中设置文本(一次一个文本框)。

一般来说,您应该Control::Invoke尽可能缩短使用的方法——它们应该只包含您的 UI 工作所需的逻辑,而不是其他功能。

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

于 2013-03-20T21:15:19.177 回答