我想在多线程函数中访问我的对话框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;
}
答案 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将消息发送到对话框。 您可以使用自定义消息或已注册消息。