土法解決作業スレッドでのMFC呼び出しダイアログ


質問:createthreadを使用して直接スレッドを生成し、そのスレッドでCDialog派生クラスを直接呼び出そうとした結果、表示できますが、LuttonDownやマウスがタイトルバーに移動するなどのメッセージがあるとすぐにエラーが発生し、デバッグして、次の声明を発見しました.
(wincore.cpp)

// Note: if either of the above asserts fire and you are
// writing a multithreaded application, it is likely that
// you have passed a C++ object from one thread to another
// and have used that object in a way that was not intended.
// (only simple inline wrapper functions should be used)
//
// In general, CWnd objects should be passed by HWND from
// one thread to another.  The receiving thread can wrap
// the HWND with a CWnd object by using CWnd::FromHandle.
//
// It is dangerous to pass C++ objects from one thread to
// another, unless the objects are designed to be used in
// such a manner.

実は私はメインスレッドから任意の変数をサブスレッドに伝達していません.問題は、私が派生スレッドクラスを使用していない方法でスレッドを使用している可能性があります.グローバルスレッド関数ではMFCの派生クラスを使用しているため、新しいウィンドウにはデフォルトの親ウィンドウがありません.--メッセージの正常なフローと伝達ができません.すなわち、ダイアログ・ウィンドウが正常に受信できず、遡及メッセージも処理できないため、致命的なエラーが発生します.したがって、スレッドを作成するときに、ウィンドウハンドルをパラメータとしてサブスレッドに渡します.以下に示します.
 
::CreateThread(NULL,0,ListenMessage,this->m_hWnd,0,&ClientThreadId);
         ,   CDialog   :
         HWND hWnd=(HWND)lpArg;
         CWnd* wnd=CWnd::FromHandle(hWnd);
         CxxxxDlg myDlg(wnd);
    (PNT 4.0  VC6),    。

一般的にはすべてMFCを使用していますが、スレッドの使用中にはこのような状況は発生しません.私は準備が不十分なため、このような気まずい状況を引き起こすのは一般的に避けるべきです.このような方法でスレッドを作成するときは、できるだけインタフェースのあるスレッドを避けなければなりません.単純なワークスレッドの仕事は同じように安定して効率的です.また、問題がないことを保証するために、ダイアログボックスの属性はpop and none border,no system menuである.
重要な声明では、この方法には推測の成分があり、本人はそれを約束しません.もしあなたが不幸にも私のように虎に乗るのが難しいなら、この方法があなたに役立つことを望んでいます.
もしあなたに役に立つなら、私にメールを送ってください([email protected])、悪口を言いたいなら、版主に送ってください.