【发布时间】:2016-09-03 01:57:29
【问题描述】:
我是 MFC 的 CWinThread 和 CAsyncSocket 的新手,并尝试通过基于对话框的应用程序自己学习它们。
这是我想要做的: 制作服务器/多客户端模型:当客户端连接到服务器时,服务器将根据客户端数量并传递连接到线程的套接字。我已经推荐这篇文章做传球:https://support.microsoft.com/en-us/kb/175668。
我已经成功地在每个连接上创建线程,但是......
我的问题是:我可以从主窗口(GUI)重新访问所有已传递给线程的套接字,以发送(广播)数据到所有客户?
这就是我通过的方式:
在服务器端:
void CMyServerDlg::OnAccept(){
CConnectSoc temp_soc;
m_Listener.Accept(temp_soc);
CSocketThread *pThr = (CSocketThread*)AfxBeginThread(
RUNTIME_CLASS(CSocketThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThr->threadHandleSocket = temp_soc.Detach();
pThr->ResumeThread();
}
注意:m_Listener 是从CAsyncSocket 派生的类的对象,CSocketThread 是从CWinThread 派生的。
在线程标题内,我添加了 2 行:
Public:
CConnectSoc threadSocket;
SOCKET threadHandleSocket;
线程类.cpp内部:
BOOL CSocketThread::InitInstance(){
threadSocket.Attach(threadHandleSocket);
return TRUE;
}
有人可以告诉我接下来要做什么将数据发送到这些套接字吗?
【问题讨论】:
-
使用PostThreadMessage 将消息发布到线程。要将线程中的消息发布到主 GUI,请使用普通的
PostMessage() -
@cha 感谢您的评论,我做了研究,
PostThreadMessage()需要 m_hthreadID。所以我想我们需要首先从线程中PostMessage()来获取该ID。并将它们存储在某个数组中,以便主 GUI 可以循环PostThreadMessage()?这是我需要做的吗? -
AfxBeginThread返回一个指向CWinThread对象的指针,该对象有一个成员函数PostThreadMessage。你只需要存储AfxBeginThread返回的指针。 -
是的,我想我已经找到了做到这一点的方法。我将在短时间内发布我自己的答案。谢谢你们所有的cmets。
标签: c++ multithreading mfc casyncsocket mfc-networking