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方法です。バックグラウンド スレッドは、スリープを実行する別のメソッドを使用してから、適切なメソッドを呼び出して、(一度に 1 つのテキスト ボックスに対して) テキストをループで設定することができます。

一般に、使用するメソッドはControl::Invokeできるだけ短くする必要があります。UI 作業に必要なロジックのみを含め、他の機能は含めないでください。

そうは言っても、この場合、 a のSystem::Windows::Forms::Timer方が適切なようです。間隔を300に設定し、タイマーのTickイベントでテキスト ボックスを 1 つずつ更新できます。

于 2013-03-20T21:15:19.177 に答える