天天看點

WSAWaitForMultipleEvents

WSAWaitForMultipleEvents函數   熟悉WSAEventSelect模型的朋友對這個函數肯定不會陌生,不對,其實大家都不應該陌生,這個函數與線程中常用的WaitForMultipleObjects函數有些地方還是比較像的,因為都是在等待某個事件的觸發嘛。   因為我們需要事件來通知我們重疊操作的完成,是以自然需要這個等待事件的函數與之配套。   DWORD WSAWaitForMultipleEvents(   DWORD cEvents, // 等候事件的總數量   const WSAEVENT* lphEvents, // 事件數組的指針   BOOL fWaitAll, // 這個要多說兩句:   // 如果設定為 TRUE,則事件數組中所有事件被傳信的時候函數才會傳回   // FALSE則任何一個事件被傳信函數都要傳回   // 我們這裡肯定是要設定為FALSE的   DWORD dwTimeout, // 逾時時間,如果逾時,函數會傳回 WSA_WAIT_TIMEOUT   // 如果設定為0,函數會立即傳回   // 如果設定為 WSA_INFINITE隻有在某一個事件被傳信後才會傳回,   //則WSAWaitForMultipleEvents 永遠等待,不會出現逾時現象。   BOOL fAlertable   //該值指定線程是否為alertable等待狀态,此時系統能執行一些I/O 完成例程。如果值為真,當系統執行I/O //完成例程時線程被處于altertable 等待狀态且WSAWaitForMultipleEvents 傳回。在這種情況下,傳回   //WSA_WAIT_IO_COMPLETION ,并且等待的event 不會觸發信号狀态。程式必須重新調用   //WSAWaitForMultipleEvents 函數。如果為false,線程不處于altertable 等待狀态,   //并且I/O 完成例程不會執行。    );   傳回值:   WSA_WAIT_TIMEOUT :最常見的傳回值,我們需要做的就是繼續Wait   WSA_WAIT_FAILED : 出現了錯誤,請檢查cEvents和lphEvents兩個參數是否有效   如果事件數組中有某一個事件被傳信了,函數會傳回這個事件的索引值,但是這個索引值需要減去預定義值 WSA_WAIT_EVENT_0才是這個事件在事件數組中的位置。   具體的例子就先不在這裡舉了,後面還會講到   注意:WSAWaitForMultipleEvents函數隻能支援由WSA_MAXIMUM_WAIT_EVENTS對象定義的一個最大值,是 64,就是說WSAWaitForMultipleEvents隻能等待64個事件,如果想同時等待多于64個事件,就要 建立額外的工作者線程,就不得不去管理一個線程池,

繼續閱讀