2014-11-23 52 views
0

我在Lobby对话框的EditBox上设置了一个线程来设置一些文本。以下是我的代码。 MainLobby是对话框类。该项目是“基于对话框的MFC项目”。我想在MFC Dialog上打印文本

MainLobby Lobby; 
_beginthreadex(NULL, 0, ReceiveMessage, (void *)Lobby.GetSafeHwnd(), 0, NULL); 
Lobby.DoModal(); 

但它不起作用。哪里错了?我很努力,但我找不到答案。 我试过Lobby.GetSafeHwnd(),但Lobby.m_hwnd

unsigned WINAPI ReceiveMessage(void *arg) 
{ 
    HWND hDlg = (HWND)arg; 

    char msg[BUF_SIZE]; 
    int msgLen; 

    while((msgLen = recv(CClientApp::hSocket, msg, BUF_SIZE, 0)) != 0) 
    { 
     SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg); 
    } 
} 

我现在用MFC。我会很高兴一个好主意。

回答

0

设备上下文必须更新。
尝试:

UpdateData(true); 
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg); 
UpdateData(false); 

或者与IDC大堂CBOX CString成员变量尝试。

0

从代码中可以清楚地看到,您没有正确使用MFC。基于Windows对话框的应用程序不需要程序员明确地创建消息处理程序或接收器,这就是MFC框架本身为您做的。在作为DoModal方法的一部分启动对话框消息循环之前,没有理由调用beginthreadex。当你在任何一个从对话框或对话框后退的类上调用DoModal时,窗口被构造,构造成员对象,并且在WM_INITDIALOG消息被发送到对话框之前启动消息循环,以便在对话窗口显示之前进行任何其他初始化。一旦窗口显示,消息循环正在运行,并且文本将在您正确发送时自动显示在编辑控件中。通常,在Visual Studio中使用类向导声明一个名为CEdit的对象,然后将MFC对象映射到对话对象。我不会列出所有的细节,我会参考这篇文章:http://msdn.microsoft.com/en-us/library/6d1asasd.aspx

0

在调用DoModal之前,对话框的HWND尚未初始化。所以你的线程没有收到正确的HWND。您可以访问正确的HWND值的第一个位置位于对话框的OnInitDialog成员函数内部。

0

我在代码中看到两个问题。

首先,您在DoModal之前拨打Lobby.GetSafeHwnd,以便在构建窗口之前。您应该将线程创建移动到MainLobby的WM_INITDIALOG处理程序以在那里创建线程。或者你可以创建一个无模式的对话框。

其次,您在MFC代码中使用_beginthreadex。如果您正在启动使用MFC的线程,则需要使用AfxBeginThread启动该线程。如果你只使用CRT,那么你使用_beginthreadex。如果您不使用,则使用Windows CreateThread。原因是每个图层(CRT,MFC)需要对线程特定的信息进行一些管理。这只能在您调用正确的线程创建函数时完成。

第三,你可能会考虑使用MFC套接字对象,如CAsyncSocket。如果套接字上有一些数据可用,该对象可以将Windows消息发送到对话框。这完全适合您的方案与应该处理套接字数据的MFC对话框。

另一件事,但你已经明白了:要访问一个MFC GUI对象,你需要在该GUI对象的线程中。因此,使用原始句柄hDlg调用Windows SetDlgItemText需要完成,因此您无法在此处调用MFC函数。

顺便说一句,你确定你的整体策略是正确的吗?我没有看到你如何处理对话生命时间,套接字的生命周期以及你如何把它们放在一起。