1

私は、C++の別のスレッドおよび別のクラスからWinformコントロールを更新しようと苦労してきました。このトピックについていくつか質問がありますが、それぞれが何らかの形で不完全であるように思われ、不足している部分を解決できません。

私のWinformスレッドにはピクチャーボックスがあります。Webカメラから画像をキャプチャして処理する別のスレッドで実行される別のクラスがあります。次に、画像を画像ボックスのWinformスレッドに表示します。VS2010 SEC++を使用しています。

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

//CameraThread.h
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Forms;

class Form1;

public class CameraThread
{
    private:
    Form1* frm1;  // compiler does not like this line
    public: CameraThread(Form1 *tfrm1)  {
    frm1 = tfrm1;
    }

void PictureUpdater(void)   {
    try {
        frm1->Invoke( Form1->UpdateBox() );
            }
            catch
            { };
}


//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;

/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
    public: delegate void UpdateDelegate(void);

    public:
    Form1(void)  {
              // constructor code
            }

    void UpdateBox(void)  {
        if (this->RawImageBox->InvokeRequired)  {
        UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
            this->RawImageBox->Invoke(d);
        }
    else {
         // code that actually updates this->RawImageBox
    }
        }
}

私のForm1クラスは正常にコンパイルされます。ただし、CameraThreadはForm1.UpdateBoxメソッドを参照する必要があります。上記のコードをコンパイルすると、CameraThreadがForm1へのポインターを宣言するために結びついている「const」を参照してエラーが発生します。Form1の前方宣言はそれを処理すると思いましたが、明らかにそうではありません。私の問題は、GUIスレッドから重要な作業を行うために別のスレッドとクラスを使用するすべての人が遭遇する問題のように思われるので、私の質問が他の人がテンプレートとして使用できる応答を促すことを期待しています。私はマルチスレッドに比較的慣れておらず、C ++の専門知識もあまり主張していないので、これが愚かなことであるとお詫びします。

4

1 に答える 1

0

別のクラスを使用するという事実は重要ではありません。これは、コードを整理する方法です。すべてを 1 つのクラスにまとめたり、10 個のクラスを作成したりできます。目標は、コードを論理的に整理することです。

UI スレッドで使用されるオブジェクト/データ フィールドに対して、別のスレッドからアクションを実行することはできません。これは機能しません。これは明らかに間違っています。ワーカー スレッドのヒープにデータを割り当て、PostMessageこのデータへのポインターを使用して呼び出し、UI スレッドで (フォームで直接) データを取得し、このデータを処理して解放します。

このように整理する必要があります。

于 2013-02-24T05:53:20.977 に答える