**usb.cpp**
m_hReadEvent=CreateEvent(NULL,TRUE,TRUE,NULL);//初始为无信号状态
m_hWriteEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
HANDLE CreateEventA(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCSTR lpName
);
**LPSECURITY_ATTRIBUTES 😗*指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则子进程不能继承该句柄。事件获取默认的安全描述符
**bManualReset:**如果此参数为TRUE,则该函数创建一个手动重置事件对象,该对象需要使用 ResetEvent函数将事件状态设置为非信号状态。
bInitialState:如果此参数为TRUE,则表示事件对象的初始状态;
lpName:如果lpName为NULL,则创建事件对象时不使用名称。
**主函数:**
OVERLAPPED overlapped;//OVERLAPPED是一个结构体
//在函数调用中使用该结构之前,应始终将该结构的任何未使用成员初始化为零。否则,函数可能会失败并返回
memset(&overlapped, 0, sizeof(OVERLAPPED));
SetEvent(usb.m_hWriteEvent);
overlapped.hEvent = usb.m_hWriteEvent ;
::WriteFile(usb.m_hWriteHandle, SendData, nTotalsize,&dwNumberofBytesWritten,&overlapped)
hEvent:操作完成后,系统会将其设置为已通知状态的事件的句柄。在将此结构传递给任何重叠的函数之前,用户必须使用CreateEvent函数将该成员初始化为零或有效的事件句柄。然后可以使用此事件来同步设备的同时I / O请求。有关更多信息,请参见备注。
在开始I / O操作之前,诸如ReadFile和WriteFile之类的功能会将此句柄设置为非信号状态。操作完成后,手柄将设置为发出信号的状态。
诸如GetOverlappedResult和同步等待功能之类的功能会将自动重置事件重置为非信号状态。因此,您应该使用手动重置事件。如果使用自动重置事件,则如果您等待操作完成,然后将bWait参数设置为TRUE,则调用GetOverlappedResult,则应用程序可以停止响应。
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
} DUMMYSTRUCTNAME;
PVOID Pointer;
} DUMMYUNIONNAME;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;