我创建了一个线程来在Lobby Dialog上的EditBox上设置一些文本。以下是我的代码。 而MainLobby是Dialog Class。该项目是“基于对话的MFC项目”。
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 :(得分:0)
必须更新设备上下文 试试:
UpdateData(true);
SetDlgItemText(hDlg, IDC_LOBBY_CBOX, msg);
UpdateData(false);
或者尝试使用IDC LOBBY CBOX的CString成员变量。
答案 1 :(得分:0)
从您的代码中可以清楚地看出,您没有正确使用MFC。基于Windows对话框的应用程序不需要程序员显式创建消息处理程序或接收器,这就是MFC框架本身正在为您做的事情。作为DoModal方法的一部分,在启动对话框消息循环之前没有理由调用beginthreadex。在从Dialog或DialogEX下载的任何类上调用DoModal时,将构造窗口,构造成员对象,并在显示对话框窗口之前将WM_INITDIALOG消息发送到对话框以进行任何其他初始化之前启动消息循环。显示窗口后,消息循环正在运行,当您正确发送文本时,文本将自动显示在编辑控件中。通常,可以使用visual studio中的类向导声明具有某个名称的CEdit对象,然后将MFC对象映射到对话框对象。我会参考这篇文章而不是输入所有细节:http://msdn.microsoft.com/en-us/library/6d1asasd.aspx
答案 2 :(得分:0)
在调用DoModal之前,尚未初始化对话框的HWND。所以你的线程没有收到正确的HWND。您可以访问正确的HWND值的第一个位置是对话框的OnInitDialog成员函数。
答案 3 :(得分:0)
我在你的代码中看到了两个问题。
首先,您在Lobby.GetSafeHwnd
之前调用DoModal
,因此在构建窗口之前。您应该将线程创建移动到MainLobby的WM_INITDIALOG
处理程序以在那里创建线程。或者你可以创建一个无模式对话框。
其次,您在MFC代码中使用_beginthreadex
。如果您正在启动使用MFC的线程,则需要使用AfxBeginThread
启动该线程。如果您只使用CRT,则使用_beginthreadex
。如果您不使用,请使用Windows CreateThread
。原因是每层(CRT,MFC)需要对线程特定信息进行一些内务处理。只有在调用正确的线程创建函数时才能执行此操作。
第三,您可以考虑使用像CAsyncSocket
这样的MFC套接字对象。如果套接字上有一些数据,则此对象可以将Windows消息发送到对话框。这非常适合您的场景,其中MFC对话框应该处理套接字数据。
另一件事,但你已经做对了:要访问MFC GUI对象,你需要在该GUI对象的线程中。因此,需要使用原始句柄hDlg调用Windows SetDlgItemText
,这里不能调用MFC函数。