InitializeCriticalSectionAndSpinCount
当一个线程试图获取一个被锁定的临界区时,它会旋转:它进入一个循环,这个循环会迭代旋转计数次数,检查锁是否被释放。如果在循环结束之前锁没有被释放,线程将进入睡眠状态,等待锁被释放
事件对象就像一个开关:它只有两种状态—开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。
CreateEvent 打开一个事件对象
SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。
WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回
ResetEvent(cmd->cmdEvent);
将指定的时间对象设置为不信号状态
EnterCriticalSection(&cmd->critical);
EnterCriticalSection(&cmd->critical);
线程同步,一个线程执行了EnterCriticalSection(&cmd->critical),没执行LeaveCriticalSection(&cmd->critical);
另一个线程再执行到EnterCriticalSection(&cmd->critical)会处于等待状态。
/**************************************************************************************************/
创建事件对象(CreateEvent):
详解请点这里
事件对象就是一个开关,只有开 关 两种状态。
开: 有信号
关:无信号
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, //reset type
BOOL bInitialState, //initial state
LPCTSTR lpName //object name
);
————————————————
参数:
lpEventAttributes 一般为NULL
bManualReset 创建的Event是自动复位还是人工复位.如果true,人工复位。
bInitialState 初始状态,true,有信号,false无信号
lpName 事件对象的名称。您在OpenEvent函数中可能使用。
操作事件对象的函数:
ResetEvent() //设置为无信号
OpenEvent() //获取事件的Handle
CloseHandle() //关闭
SetEvent()或PulseEvent() //设置,使其有信号。
WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号.
返回值:
该函数创建一个Event同步对象,如果CreateEvent调用成功的话,会返回新生成的对象的句柄,否则返回NULL。
/*****************************************************************************************************/
WinUsb_ReadPipe和WinUsb_WritePipe函数功能理解
BOOL __stdcall WinUsb_ReadPipe(
_In_ WINUSB_INTERFACE_HANDLE InterfaceHandle,
_In_ UCHAR PipeID,
_Out_ PUCHAR Buffer,
_In_ ULONG BufferLength,
_Out_opt_ PULONG LengthTransferred,
_In_opt_ LPOVERLAPPED Overlapped
);
————————————————
参数:
InterfaceHandle 和那个端点的那个管道联接
PipeID 管道的地址,第7位表示端点数据方向:0表示OUT(主-从),1表示IN(从-主)
Buffer 接收读取的数据的缓冲区。
BufferLength 读取数据的最大个数,这个值必须小于或等于Buffer缓冲区中的字节个数。
LengthTransferred 一个无符号长整型指针,接收实际复制到Buffer缓冲区中的个数。
Overlapped,一般定为一个空指针,NULL。
返回值:
操作成功返回TRUE,失败返回FALSE。(GetLastError获取错误返回值)
注意事项:
如果设备返回数据(我理解是INpacket)大于最大的传输长度,WinUSB将分离这个数据成一较小段的,并且连续提交。如果这个传输数据的长度不是最大传输长度的整数倍,WINUSB就会把他增加到最大传输个数的倍数。
USB包的大小不考虑传输请求,如果设备响应了一个对现在的缓冲区来说较大的包,并且读请求符合管道上指针的类型,如果管道指针允许部分读取(ALLOW_PARTIAL_READS,),WINUSB将把剩下的数据放在下次传输的开头,
如果第六个参数为非空,第五个参数设置的值是无意义的。
如果PIPE为空,WinUsb_ReadPipe我们函数不返回直到PIPE中有数据,如果出现错误状况或者超时,函数就返回FALSE,(GetLastError获取错误返回值).