任务描述:将服务器主对话框的链表数据通过不同的客户端线程发送出去。
具体描述如下:
主对话框中有一个消息链表list<DataBuf*> m_List;该消息链表不断增加中。
服务器端原来已经创建了多个客户端线程,主要用来接收从客户端过来的数据:
线程定义如下:
hThread = (HANDLE)_beginthreadex(NULL,0,SocketThreadProc,this, CREATE_SUSPENDED, &uiThreadId);
UINT WINAPI CSocketComm::SocketThreadProc(LPVOID pParam)
{
     while( TRUE )
    {
....
res = recv( s, (LPSTR)lpBuffer, len, 0);

我现在想将服务器主对话框的链表数据发送到各个客户端,目前是这样做的:
在主对话框中有一个函数从链表头开始读取节点信息,并发送出去
void MainDlg::aaa()
{
DataBuf *pDataBuf =m_List.front();
res = send( s, (LPCSTR)pDataBuf, len1, 0);
}
这样的话,所有的消息都是通过主线程来发送,会带来效率问题,我又不想重新创建新线程来处理发送操作。所以我希望通过原来创建的客户端接收线程来发送这些数据,并且不太影响原来的recv操作,在主线程中目前只是知道原来创建的客户端线程句柄HANDLE hThread;,不知道该怎么写才好,多谢。

解决方案 »

  1.   

    主线程还做了很多事的,所以我想将res = send( s, (LPCSTR)pDataBuf, len1, 0);这句话放到客户端线程中,使发送和接收在同一个线程中,这样也比较符合逻辑嘛,就是不知道该怎么放好。
      

  2.   

    可以这样做:1 创建2个HEVENT内核对象2 使用WSAEventSelect,将socket与其中一个事件对象关联3 当需要发消息时,SetEvent将令一个事件对象设为通知4 线程函数使用WaitForMultipleObjects阻塞在2个事件对象上5 WaitForMultipleObjects返回时,说明其中一个事件是通知状态,根据返回值确定是哪个事件如果是socket关联的,就做接收报文处理,如果是发送消息的那个,则发送报文