0

別のスレッドで実行されている別のクラスから Winform ピクチャボックスを更新しようとしています。Update WinForm Controls from another thread _and_ classの回答に従いました。このクラスには、Winform/Winform メンバー関数への参照をコンストラクター内のスレッドに正確に渡す方法/Winform メンバー関数の呼び出し方法以外のすべての情報が含まれているようです。スレッドから。

私のコードは次のとおりです。

//Camera.h

public class CameraThread
{
    public:
       CameraThread(????)
       {
           // constructor
       }

       void DoSomething
       {
         // call UpdateBox on Form1
         ????
       }
};

//Form1.h
namespace SV7 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    public ref class Form1 : public System::Windows::Forms::Form
    {
        private: CameraThread* CT;
        private: boost::thread* ImageACQ;

        public: delegate void UpdateDelegate(void);
        public:
            Form1(void)
            {
                CT = new CameraThread(????);
                boost::thread* ImageACQ = new boost::thread(&CameraThread::ImageAcquisition,CT);
                InitializeComponent();
                InitializeCanny();
            }

            void UpdateBox(void) 
            {
                if (this->RawImageBox->InvokeRequired) 
                {
                    UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
                    this->RawImageBox->BeginInvoke(d);
                }
                else 
                {
                }
            }
    };
}

???? をどこに置いたのか、メンバー関数を渡す/呼び出すために使用する構文がわかりません。Camera.h で Form1 の前方宣言が必要だと思いますが、Form.h で実際のフォーム クラスを参照するのに問題がありました。ただし、ストレートな関数ポインターが使用された場合、それは適切な方法ではないと思います。

背景として、私は VS2010 SE C++ を使用しています。ウェブカメラから画像を取得し、OpenCV を使用して処理し、結果を GUI スレッドのピクチャ ボックスに表示する別のスレッドを作成しようとしています。

私はこれを行う方法を知らないだけで、ガイダンスをいただければ幸いです。前もって感謝します/

4

1 に答える 1

1

クラス内に Form1 インスタンスが必要なので、コンストラクター呼び出しは次のようになります。

CT = new CameraThread(this);

私は C++/CLI にはあまり詳しくないので、構文が完全ではないかもしれませんが、意味は明確なはずです。クラスは Form1 のインスタンスを取得し、UpdateBox を呼び出す必要があるまで保存する必要があります。

public class CameraThread
{
    private:
       Form1^ form;
    public:
       CameraThread(Form1^ form)
       {
           // constructor
           this->form = form;
       }

       void DoSomething
       {
         // call UpdateBox on Form1
         form->UpdateBox();
       }
};

.NET Framework と boost という 2 つの強力なライブラリが混在していることに注意してください。両方が必要ない場合は、どちらか一方を使用する必要があります。.NET Framework にもスレッドがあります。

于 2013-03-03T07:44:37.810 に答える