如何在多线程函数MFC

时间:2017-07-21 10:35:24

标签: multithreading sockets visual-c++ mfc

我想在多线程函数中访问我的对话框UI(编辑框),这是我定义全局或独立函数。 CSampleDlg* m_dlg=(CSampleDlg*)_param;这里是_param是线程函数的参数。当我试着这个崩溃时:ASSERT(::IsWindow(m_hWnd));

//这里是示例代码mfc

UINT MessageThread(LPVOID _param)
{
    CServerDlg* m_dlg=(CServerDlg*)_param; 
    char cChar[1024];
    CString strmsg=L"";

    while (!stopNow && (currValue < maxValue))
    {
        m_dlg->m_messagebox.GetWindowTextW(strmsg); //m_messagebox :editbox
        sprintf(cChar,"%s",CW2A(strmsg));
        char *buff=(char*)&cChar;
        m_dlg->m_server.Send(buff,sizeof(cChar));
        currValue++;
        Sleep(50);  
    }

    return TRUE;
}

3 个答案:

答案 0 :(得分:1)

如果要访问其后面的窗口对象,则在线程之间使用CWnd指针是危险的。 CWnd指针存储在每个线程映射中。使用由MFC包装的窗口API函数可能会失败或抛出ASSERT。

您可以使用嵌入式m_hWnd句柄,并且可以将GetWindowText与此句柄一起使用。但即使不是一个很好的解决方案。

UI和其他workerthread操作应该严格分割。因此,除了直接访问窗口之外,更好的方法是将您想要发送的信息发送到其他任何方法。

答案 1 :(得分:0)

m_dlg->m_messagebox.GetWindowTextW(strmsg);是来自工作线程的非常危险的声明。同样,不建议在线程上传递CDialog的指针。

即使没有将CDialog的指针传递给线程,也可以为您的问题提供许多解决方案。

我假设您要跟踪对话框中编辑控件中文本的更改,并使用工作线程将其传递给server。您可以选择具有全局缓冲区,您可以在其中从编辑控件复制文本,然后向线程发送通知以发送它。在将数据复制到全局缓冲区之前,不要忘记将lock放在全局缓冲区上。

您甚至可以考虑使用CList对象来维护要发送到服务器的文本列表。 GUI将push文本发送到服务器到Clist对象。您的帖子可以从pop CList文本(如果可用)并将其发送到服务器。

答案 2 :(得分:0)

“如何在多线程函数MFC中获取对话框类的指针”? 你不。具有句柄(包括MFC窗口对象)的任何对象都应该将句柄传递给该线程。手柄是独一无二的。如果发送指针,它将指向线程本地存储中的不同区域(如果有)。 使用发送/发布消息API将消息发送到对话框。 您可以使用自定义消息或已注册消息。