7

ワーカー スレッドを持つ MFC アプリケーションがあります。やりたいことは、ワーカー スレッドからメイン GUI スレッドにメッセージを投稿して、GUI のステータス メッセージを更新することです。私がこれまでやってきたことは、Registered a new window message

//custom messages
static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE");

このメッセージをダイアログ クラスのメッセージ マップに追加しました

ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate)

の原型OnStatusUpdate

afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM);

そして定義は

LRESULT CMFC_TestApplicationDlg::OnStatusUpdate(WPARAM wParam, LPARAM lParam)
{

     //This function is not called at all.
     return 0;
}

ワーカースレッド呼び出しコードは

void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
{
    ThreadParams params;
    params.m_hWnd = m_hWnd;
    params.FTPHost = "test_host";
    params.FTPUsername = "test";
    params.FTPPassword = "test";

    AfxBeginThread(FTPConnectThread,&params);
}

ワーカースレッドコードは

//child thread function
UINT FTPConnectThread( LPVOID pParam )
{
    if(pParam == NULL)
    {
        return 0;
    }
    ThreadParams *params = (ThreadParams*)pParam;
    OutputDebugString(params->FTPHost);
    Sleep(4000); //simulating a network call
    CString * message = new CString("Conencted");
    PostMessage(params->m_hWnd,FTP_APP_STATUS_UPDATE,0,(LPARAM)message);
    //PostMessage do nothing? what I am doing wrong?
    return 1;
}

問題は、PostMessage 関数が呼び出されたときに呼び出されるOnStatusUpdateはずですが、呼び出されておらず、例外やアサーションがスローされていないことです。何が間違っていますか? 私は試してみON_REGISTERED_MESSAGEましON_MESSAGEたが、成功しませんでした。

4

1 に答える 1

5

CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()スレッドが開始する前に戻る可能性があります。これにより、ThreadParamsスコープ外になるため、スレッドからアクセスすると、解放されたメモリにアクセスします。次のような別の方法で割り当てる必要があります。

void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()
{
    ThreadParams* params = new ThreadParams();
    params->m_hWnd = m_hWnd;
    params->FTPHost = "test_host";
    params->FTPUsername = "test";
    params->FTPPassword = "test";

    AfxBeginThread(FTPConnectThread,params);
}

//child thread function
UINT FTPConnectThread( LPVOID pParam )
{
    if(pParam == NULL)
    {
        return 0;
    }

    ThreadParams *params = (ThreadParams*)pParam;
    OutputDebugString(params->FTPHost);
    Sleep(4000); //simulating a network call
    CString * message = new CString("Conencted");
    PostMessage(params->m_hWnd,FTP_APP_STATUS_UPDATE,0,(LPARAM)message);

    delete params;
    return 1;
}
于 2012-05-23T12:34:37.940 に答える