2016-04-04 2 views
0

Visual Studio 2015(Community Edition)を使用& MFC C++プロジェクト。私は作業者 私はPostMessage()関数を使用してこのスレッドからメインUIスレッド(ここで私のCDialogが存在する)にデータを送信したいのですが、同じクラスの私は がこのメッセージを受け取りたいと思っています。 MyComm.hファイルでmfc C++ postmessageを使用したカスタムメッセージを作業スレッドからメインUIスレッドに送信

、私は次のようしている:私のMyComm.cppファイルで

#define WM_USERRESPONSE WM_APP + 2000 

class MyComm: public CDialog 
{ 
    ... 
    CWnd* m_pParent; 
    static BOOL m_bThreadKill; 
    static CWinThread* pThread; 
    static CEvent* pEvent; 
    static CEvent m_ThreadKillEvent; 
    ... 
    static UINT MyThreadProc(LPVOID pParam); 
    ... 
    afx_msg LRESULT OnResponse(WPARAM wParam, LPARAM lParam); 
    ... 
}; 

、私は次のようしている:

MyComm::MyComm(CWnd* pParent /*=NULL*/) 
    : CDialog(IDD_PPAGE_COMMAND, pParent) 
{ 
    m_pParent = pParent; 

    pEvent = new CEvent(FALSE, FALSE); 

    if ((pThread = AfxBeginThread(MyThreadProc, this)) == NULL) 
    AfxMessageBox("Could not Create Read Thread!"); 

    pThread->m_bAutoDelete = FALSE; 
    m_ThreadKillEvent.ResetEvent(); 
    m_ReadThreadDead.ResetEvent(); 
    running = 1; 
} 

UINT MyComm::MyThreadProc(LPVOID pParam) 
{ 
    MyComm *pMyHndl = ((MyComm*)pParam); 
    string s = "I would like this string posted"; 
    BOOL b = false; 

    b = ::PostMessage(pMyHndl->GetSafeHwnd(), WM_USBRDRESPONSE, 0, 
     (LPARAM)&s); 
} 

BEGIN_MESSAGE_MAP(MyComm, CDialog) 
    ON_MESSAGE(WM_USERRESPONSE, &MyComm::OnResponse) 
END_MESSAGE_MAP() 

afx_msg LRESULT MyComm::OnResponse(WPARAM wParam, LPARAM lParam) 
{ 
    MyStruct* p = (MyStruct*)lParam; 
    ... 
} 

注私が滞在してこの一部を省略トピックに関する

これよりも多くのコードがありますが、スレッドを開始したことを確認して、このPostMessage()関数を実行してtrueを返します。私は に、受信者を対象としたOnResponse()関数を使用することはありません。私は確信していません なぜ..(??)..

いくつかの考え。 MyCommクラスが同じクラスにあり、ダイアログスレッドではなく であることは確かですが、それはまだそれによって生成されており、CDialogから派生しています。この は十分でないかもしれませんか?私はまだ、MFC プログラミングパラダイムを介してスレッドに少し新しいことを認めます。どんな助けもありがとうございます。

Maddog

+0

配信の問題を引き起こしませんが、メッセージが配信されたときに文字列 's'は存在しますか? MyThreadProc()が返ってきたら、それはRAIIでなくなってしまいますか? –

+0

申し訳ありませんが、実際のコードではスレッドは返されません(つまり、(1)...)または終了するまで。 –

+0

私の場合、この文字列は、スレッドが生成されたときに作成されるバッファです。 –

答えて

0
  • 変数string sは、スレッドが終了した後に存在しません。表示されたスレッド関数が小さすぎるため、すぐに終了します。
  • コンストラクターにない新しいスレッドを理想的にはOnInitDialogから開始する必要があります。メッセージループはコンストラクタでは作成されませんが、whileはOnInitDialogに作成されます。
  • メッセージコードが正しいことを確認してください。あなたのコードには、WM_USBRDRESPONSEWM_USBRDRESPONSE
+0

前に言ったように、私のコードのスレッドは殺されるまで完了しません。私はSendMessage()も受信していないことがわかりました。 2番目は、続行する前に投稿するメッセージを待つ必要があります。私がここで別の質問で発見した何か[link](http://stackoverflow.com/questions/18271229/mfc-send-message-to-main-thread-rather-than-a-window)では、私のPostMessage()そのメッセージをウィンドウに送ります。私の現在のクラスは、ダイアログクラスで生成される以外はウィンドウレスです。 –

+0

これは、MyCommクラスがOnInitDialog()メソッドを実行しない理由を説明しています。だから私は実際にここに隠しウィンドウを作成する必要があります。シグナルそのものに対する謝罪。私のコードでは、メッセージはWM_USBRDRESPONSEです。ここでは簡略化のためにWM_RESPONSEという名前を付けました。私は100ページ以上の長さであり、知的財産の問題が起きているので、ここにコード全体を載せたくありませんでした。 –

+0

ダイアログはどのように表示されますか? DoModal、ShowWindow? – Ajay

0

の両方があります。今日、この問題の答えが見つかりました。

スレッドが開始されるクラスはまだ ウィンドウに関連付けられたクラスではないため、ウィンドウで1つ生成されます。だから、pMyHndl に微妙なニュアンスが必要です。 POSTMESSAGE()の場合は、代わりに、m_pParentがParentクラス(ウィンドウ付き)を指す場所の代わりにpMyHndl->m_pParent を使用します。 このコードは、メッセージ を受け取るコードがそこに移動したので、メッセージを受信しました。みんな助けてくれてありがとう。

maddog

関連する問題