PostMessage из WorkerThread в главное окно в MFC

У меня есть приложение MFC, в котором есть рабочий поток, и я хочу отправить сообщение из рабочего потока в основной поток графического интерфейса для обновления некоторых сообщений о состоянии в графическом интерфейсе. То, что я сделал до сих пор, 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 но безуспешно, любая помощь?

1 ответ

Решение

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;
}
Другие вопросы по тегам