ReadFile()の使用時にReadFileのtimeoutを変更する方法


ReadFile()関数を使用すると、N秒以内に自分で定義したパケットが受信されない場合、timeoutになります.では、N秒の具体的な時間はどのように定義されますか?
非同期方式(OVERLPPED)で開き、すなわちReadFile()の最後のパラメータでOVERLPPEDポインタを関連付け、WaitForSingleObjectでこの非同期ハンドルを待つことで実現する.
WaitForSingleObject()関数の2番目のパラメータは、timeout時間と簡単に理解できます.
 
WaitForSingleObjectの使い方
DWORDWaitForSingleObject  (  HANDLEhHandle,   DWORDdwMilliseconds );
パラメータhHandleはイベントのハンドルであり、2番目のパラメータdwMillisecondsは時間間隔である.時間が信号状態であればWAIT_に戻るOBJECT_0時間がdwMilliseconds値を超えても時間イベントが無信号の場合WAIT_を返すTIMEOUT .
WaitForSingleObject関数はhHandleイベントの信号状態を検出するために使用され、関数の実行時間がdwMillisecondsを超えると返されますが、パラメータdwMillisecondsがINFINITEの場合、関数は対応する時間イベントが信号状態になるまで返されます.そうしないと、WaitForSingleObjectが戻ってくるまで待っています.
http://www.cnblogs.com/andyhere/archive/2008/10/20/1314803.html
 
プログラムの例:
/*API call:ReadFile
	'Returns: the report in InputReport.
	'Requires: a device handle returned by CreateFile
	'(for overlapped I/O, CreateFile must be called with FILE_FLAG_OVERLAPPED),
	'the Input report length in bytes returned by HidP_GetCaps,
	'and an overlapped structure whose hEvent member is set to an event object.
	*/

	if (ReadHandle != INVALID_HANDLE_VALUE)
		{
		Result = ReadFile 
		(ReadHandle, 
		InputReport, 
		Capabilities.InputReportByteLength, 
		&NumberOfBytesRead,
		(LPOVERLAPPED) &HIDOverlapped
		); 
		}
 
//	DisplayLastError("ReadFile: ") ;

	/*API call:WaitForSingleObject
	'Used with overlapped ReadFile.
	'Returns when ReadFile has received the requested amount of data or on timeout.
	'Requires an event object created with CreateEvent
	'and a timeout value in milliseconds.
	*/

	Result = WaitForSingleObject 
		(hEventObject, 
		20000);		//           timeout  
		
	switch (Result)
	{
		case WAIT_OBJECT_0:
		{
			//              
			break;
		}
		case WAIT_TIMEOUT:
		{
			// timeout    
			break;
		}
	}	

reference:http://bbs.eeworld.com.cn/thread-150077-1-1.html