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