0

私は次のクラス階層を持っています:

クラスBaseProcess
{{
    public virtual void Execute()= 0;  

};

クラスサブプロセス:BaseProcess
{{
    public virtual void Execute()
    {{
        //何かをする

        //ここでGUIにコールバックする必要があります。おそらく、ファイルセレクタからファイルパスを取得するためです。

        //他のことをする

        //操作の進行状況に応じてGUIを更新したい

        //より多くの処理   
    }
};

SubProcessオブジェクトが作成され、GUIボタンのイベントハンドラーから呼び出されると仮定します。

私の質問は、Execute()関数内からGUIを操作するための最良の方法は何ですか?(また、Execute()が別のスレッドで実行されている可能性があると想定しています)

私が持っていたアイデアは、コールバックをSubProcessオブジェクトに渡すことでした。これにより、GUIに情報を送信できるようになりますが、ファイルセレクターの場合、データをSubProcessオブジェクトに戻すための最良の方法は何でしょうか。 ?リクエストに応じてさまざまなタイプのデータを返すことができるように、ソリューションをできるだけ一般的にしたいと思います。

注:コードの間違いは無視してください。問題を説明するために、サンプルをすばやくまとめました。

アップデート:

明確にするために申し訳ありませんが、これはWindows、MFCになります。全体的な設計はほとんどのGUIフレームワークに適用できるはずなので、これがどれほど重要かわかりません。

4

4 に答える 4

2
class SubProcess : BaseProcess
{
    public virtual void Execute()
    {
        //Do Something

        char file_name[MAX_PATH +1];
        myWindow->SendMessage(WM_GETFILE, max_path, (LPARAM)file_name); 

        //Do Something Else

        myWindow->SendMessage(WM_UPDATE, 50);

        //More processing   
    }
};

ウィンドウクラスでは:

#define WM_GETFILE (WM_USER+1)
#define WM_UPDATE (WM_USER+2)

BEGIN_MESSAGE_MAP(CMyWindow, CWnd)
    ON_MESSAGE(WM_GETFILE, MyGetFileHandler)
    ON_MESSAGE(WM_UPDATE, MyUpdateHandler)
END_MESSAGE_MAP()

LRESULT CMyWindow::MyGetFileHandler(WPARAM wParam, LPARAM lParam)
{
}
LRESULT CMyWindow::MyUpdateHandler(WPARAM wParam, LPARAM lParam)
{
}
于 2012-11-01T13:58:19.560 に答える
1

少し前に使用した MFC 手法は、標準のIdle Loop処理に基づいていました。

これは簡単な方法です。メイン スレッドで実行すると、ワーカーは GUI オブジェクトを直接操作できるからです。

ワーカー プロセスからメッセージ ループを「十分に頻繁に」呼び出すと、GUI はスムーズに動作し続けます。

開発サイクルにある程度の複雑さを許容できる場合は、代わりにスレッドを使用できますが、私の経験では、より困難です。

于 2012-11-01T14:06:58.407 に答える
0
class GuiCallback
{
 public:
     string getFilePath () {/*show the dialog and return the path*/}
     void update (/*arguments with data*/) {}
};
class BaseProcess
{
    public virtual void Execute(GuiCallback*) = 0;  

};

class SubProcess : BaseProcess
{
    public virtual void Execute(GuiCallback* callback)
    {
        //Do Something

        string path = callback->getFilePath ();

        //Do Something Else

        callback->update (...);

        //More processing   
    }
};

の実装はgetFilePathupdate使用するプラットフォーム/GUI フレームワークによって異なります

于 2012-11-01T13:54:02.323 に答える
0

GUIに依存します。GUI を使用して別のスレッドから制御できるシステムを使用している場合は、Execute() 内から直接 GUI 呼び出しを行うことができます。GUI でこれが許可されていない場合は、メッセージを介してメイン スレッドと通信し、そこで GUI 呼び出しを行い、結果を Execute() スレッドに送り返すことができます。

これをかなり簡単に実装できるようにする GUI フレームワークはQtで、シグナルとスロットのメカニズムを使用しています。

于 2012-11-01T13:51:58.980 に答える