我的线程的作用是等待客户端的连入,我用的是异步模式,这就需要不停的访问我开的端口,如果我把它写在一个
 while (true) { ... }
这样的死循环里的话那么CPU占用率就会一直保持在100%,但是我又不想用sleep这样的函数,因为我需要即时的响应客户端的连接。但是如果我使用同步模式的话,如果客户端没有连接过来则程序会一直停留在端口监听函数里,但是这时的cpu占用率几乎没有,就好像线程处于空闲状态一样,我想自己实现,怎么办?

解决方案 »

  1.   

    你设置一个标志或者一个Event ,这儿Waitingforsingleobject
      

  2.   

    也就是说我用WaitForSingleObject“监听”我的SOCKET对象,当有客户端连入就会自动出发Event并跳出WaitForSingleObject是吗?SOCKET对象是系统内核对象吗?WaitForSingleObject可以“监听”非系统内核对象吗?谢谢,答完给分。
      

  3.   

    楼主可以用EVENT来做,
    用WSACreateEvent();
    WSAWaitForMultipleEvents()等,用法与
    CreateEvent()等API参数差不多,请参看MSDN
      

  4.   

    #include "winsock2.h"
    #pragma comment(lib,"ws2_32.lib")WSAEVENT g_WSAEvent = WSACreateEvent() ;//全局变量在主线程中设置
    WSAEventSelect(hSocket,g_WSAEvent,FD_XXX) ;//hSocket为申请的SOCKET
    这样就可以对g_WSAEvent 事件进行“监听”在监听线程中可以这个样
    DWORD ListenThreadProc(LPARAM lParam)
    {
      WSAEVENT array_Event[] = {g_WSAEvent} ;
      DWORD dwSize = sizeof(array_Event) / sizeof(WSAEVENT) ;
      do
      {
        DWORD dwResult = WSAWaitForMultipleEvents(dwSize,array_Event,TRUE,FALSE) ;  
        if(dwResult == WSA_WAIT_EVENT_0)
        {
           //判断读或写代码
        }
        WSAResetEvent(g_WSAEvent) ;
      }
      while(TRUE);
    }