【问题标题】:Invoke Windows Form Thread and Sleeping调用 Windows 窗体线程并休眠
【发布时间】:2013-03-20 21:06:42
【问题描述】:

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

【问题讨论】:

  • 你为什么要为此使用线程?首先在 UI 线程上设置 20 个文本框更快...
  • 因为 sleep() 导致 UI 崩溃

标签: multithreading managed-c++ invokerequired


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多