PostMessage from WorkerThread to Main Window in MFC

mfc, multithreading, postmessage, user-interface, worker-thread

Solution

`CMFC_TestApplicationDlg::OnBnClickedMfcbutton1()` may return before the thread starts. This causes your `ThreadParams` to go out of scope, so when you access it from the thread, you are accessing freed memory. You need to allocate it some other way, such as:

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;
}

Problem

I have a MFC application, which has a worker thread, what I want to do is to post message from worker thread to the Main GUI thread to update some status messages on GUI. What I have done so far is `Registered a new window message` ``` //custom messages static UINT FTP_APP_STATUS_UPDATE = ::RegisterWindowMessageA("FTP_APP_STATUS_UPDATE"); ``` Added this message to the message map of dialog class ``` ON_MESSAGE(FTP_APP_STATUS_UPDATE, &CMFC_TestApplicationDlg::OnStatusUpdate) ``` The prototype of `OnStatusUpdate` is ``` afx_msg LRESULT OnStatusUpdate(WPARAM, LPARAM); ``` and definition is ``` LRESULT CMFC_TestApplicationDlg::OnStatusUpdate(WPARAM wParam, LPARAM lParam) { //This function is not called at all. return 0; } ``` and the worker thread calling code is ``` void CMFC_TestApplicationDlg::OnBnClickedMfcbutton1() { ThreadParams params; params.m_hWnd = m_hWnd; params.FTPHost = "test_host"; params.FTPUsername = "test"; params.FTPPassword = "test"; AfxBeginThread(FTPConnectThread,&params); } ``` and Worker thread code is ``` //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; } ``` the problem is when the PostMessage function is called the `OnStatusUpdate` should be called, but it is not being called, no exception or assertion is thrown, What I am doing wrong? I have tried `ON_REGISTERED_MESSAGE` and `ON_MESSAGE` but no success, any help?

Original source