multithreading - 从 WorkerThread 到 MFC 中的主窗口的 PostMessage

标签 multithreading user-interface mfc postmessage worker-thread

我有一个 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的原型(prototype)是
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_MESSAGEON_MESSAGE但没有成功,有什么帮助吗?

最佳答案

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

关于multithreading - 从 WorkerThread 到 MFC 中的主窗口的 PostMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719902/

相关文章:

windows - 如何正确循环/获取文本/选择 SysTreeView32 窗口项

c# - 如果没有应用程序回收,在 ASP.NET 中使用后台 worker 有好处吗?

ios - dismissViewControllerAnimated 不会关闭

c - 在不创建新线程的情况下将调试器附加到进程

html - 您在网站中使用什么 Unicode 字符? (而不是图像图标)

c++ - 错误 : 'CPtrList::AddTail' : 2 overloads have no legal conversion for 'this' pointer

c++ - 无法打开包含文件 : 'log4cxx\logger.h' : No such file or directory

c++ - 两个线程可以调用同一个 DLL 中的两个函数吗?

java - 与Java的级联同步

c++ - 关于多线程的问题