#include <windows.h><br />#include <stdio.h><br />void main()<br />{<br />HANDLE hfile = CreateFile("test.txt",GENERIC_READ | GENERIC_WRITE,<br />0,NULL,CREATE_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL,NULL);<br />if (hfile == INVALID_HANDLE_VALUE)<br />{<br />printf("invalid handle value./n");<br />}<br />OVERLAPPED oWrite = { 0 };<br />oWrite.Offset = 0;<br />oWrite.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);<br />WriteFile(hfile, "Jeffery chen", 14, NULL, &oWrite);<br />BYTE bBuffer[10];<br />OVERLAPPED oRead = { 0 };<br />oRead.Offset = 5; /**start from 6 char */<br />oRead.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);<br />ReadFile(hfile, bBuffer, 10, NULL, &oRead);</p><p>HANDLE h[2];<br />h[0] = oRead.hEvent;<br />h[1] = oWrite.hEvent;<br />while (true)<br />{<br />Sleep(3000);<br />DWORD dw = WaitForMultipleObjects(2, h, FALSE, 1000);<br />if(dw == WAIT_OBJECT_0)<br />{<br />printf("can be read./n");<br />oRead.Offset += 1;<br />//ReadFile(hfile,bBuffer,10,NULL,&oRead);<br />//Handle to an event set to the signaled state when the transfer has been completed<br />//當調用完ReadFile後,會自動化佈建到有訊號狀態。<br />printf("%s/n",bBuffer);<br />}<br />else if (dw == (WAIT_OBJECT_0 + 1))<br />{<br />printf("can write io./n");<br />//WriteFile(hfile,"shawn",6,NULL,&oWrite);<br />//Handle to an event set to the signaled state when the transfer has been completed<br />}<br />else<br />break;<br />}<br />getchar();<br />}
在建立event時,第二個參數表明是否為manual-reset event,此處設為false,表明系統自動管理。
當調用WaitForMultipleObject時使訊號處於無訊號狀態。
當調用ReadFile或WriteFile時使訊號處於有訊號狀態 。