Win32 线程的事件使用

HANDLE WINAPI CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL bManualReset,  // TRUE = 手动复位,FALSE = 自动复位
  BOOL bInitialState, // TRUE = Singled,FALSE = Unsingled
  LPCTSTR lpName
);

  一个Event被创建以后,可以用OpenEvent来获得它的Handle,用CloseHandle来关闭它,用SetEvent或PulseEvent来设置它使其有信号,用ResetEvent来使其无信号,用WaitForSingleObject或WaitForMultipleObjects来等待其变为有信号。
  当一个手动复位的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至明确调用ResetEvent函数将其置为无信号状态。任意数量的等待中线程,以及随后开始等待的线程均会被释放。
  当一个自动复位的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至一个等待线程被释放;系统将自动将此状态置为无信号状态。如果没有等待线程正在等待,事件对象的状态将保持有信号状态。
  对于自动复位的Event对象,PulseEvent仅释放第一个等待该事件的线程,对象状态随后会被设回Unsingled。
  对于手动复位的Event对象,PulseEvent释放所有正在等待该事件的线程,对象状态随后会被设回Unsingled。
  BOOL SetEvent();
  设置事件的状态为有标记,释放任意等待线程。如果事件是手工的,此事件将保持有标记直到调用ResetEvent。这种情况下将释放多个线程,如果事件是自动的,此事件将保持有标记,直到一个线程被释放,系统将设置事件的状态为无标记。如果没有线程在等待,则此事件将保持有标记,直到一个线程被释放。

HANDLE hThread;
HANDLE hEvent;
DWORD WINAPI ThreadProc1(LPVOID lpParamenter);
int main(int argc, char* argv[])
{
  hEvent = CreateEvent(NULL, TRUE, FALSE, "abc");
  hThread = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
  getchar();
  PulseEvent(hEvent);
  Sleep(1000);
  getchar();
  SetEvent(hEvent);
  Sleep(1000);
  ResetEvent(hEvent);
  getchar();
  PulseEvent(hEvent);
  Sleep(1000);
  TerminateThread(hThread, 0);
  printf("Hello World!\n");
  return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lParamenter)
{
  int iCount = 0;
  while(TRUE)
  {
    WaitForSingleObject(hEvent, INFINITE);
    printf("%d\n", iCount++);
  }
  return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值