#ifndef _HIK_EVENT_H_
#define _HIK_EVENT_H_ #ifdef _MSC_VER
#include <Windows.h>
#define hik_event_handle HANDLE
#else
#include <pthread.h>
typedef struct
{
bool state;
bool manual_reset;
pthread_mutex_t mutex;
pthread_cond_t cond;
}event_t;
#define event_handle event_t*
#endif //返回值:NULL 出错
event_handle event_create(bool manual_reset, bool init_state); //返回值:0 等到事件,-1出错
int event_wait(event_handle hevent); //返回值:0 等到事件,1 超时,-1出错
int event_timedwait(event_handle hevent, long milliseconds); //返回值:0 成功,-1出错
int event_set(event_handle hevent); //返回值:0 成功,-1出错
int event_reset(event_handle hevent); //返回值:无
void event_destroy(event_handle hevent); #endif ////////////
<pre class="cpp" name="code">#include "event.h"
#ifdef __linux
#include <sys/time.h>
#include <errno.h>
#endif
#include <iostream>
event_handle event_create(bool manual_reset, bool init_state)
{
#ifdef _MSC_VER
HANDLE hevent = CreateEvent(NULL, manual_reset, init_state, NULL);
#else
event_handle hevent = new(std::nothrow) event_t;
if (hevent == NULL)
{
return NULL;
}
hevent->state = init_state;
hevent->manual_reset = manual_reset;
if (pthread_mutex_init(&hevent->mutex, NULL))
{
delete hevent;
return NULL;
}
if (pthread_cond_init(&hevent->cond, NULL))
{
pthread_mutex_destroy(&hevent->mutex);
delete hevent;
return NULL;
}
#endif
return hevent;
}
int event_wait(event_handle hevent)
{
#ifdef _MSC_VER
DWORD ret = WaitForSingleObject(hevent, INFINITE);
if (ret == WAIT_OBJECT_0)
{
return ;
}
return -;
#else
if (pthread_mutex_lock(&hevent->mutex))
{
return -;
}
while (!hevent->state)
{
if (pthread_cond_wait(&hevent->cond, &hevent->mutex))
{
pthread_mutex_unlock(&hevent->mutex);
return -;
}
}
if (!hevent->manual_reset)
{
hevent->state = false;
}
if (pthread_mutex_unlock(&hevent->mutex))
{
return -;
}
return ;
#endif
}
int event_timedwait(event_handle hevent, long milliseconds)
{
#ifdef _MSC_VER
DWORD ret = WaitForSingleObject(hevent, milliseconds);
if (ret == WAIT_OBJECT_0)
{
return ;
}
if (ret == WAIT_TIMEOUT)
{
return ;
}
return -;
#else int rc = ;
struct timespec abstime;
struct timeval tv;
gettimeofday(&tv, NULL);
abstime.tv_sec = tv.tv_sec + milliseconds / ;
abstime.tv_nsec = tv.tv_usec* + (milliseconds % )*;
if (abstime.tv_nsec >= )
{
abstime.tv_nsec -= ;
abstime.tv_sec++;
} if (pthread_mutex_lock(&hevent->mutex) != )
{
return -;
}
while (!hevent->state)
{
if (rc = pthread_cond_timedwait(&hevent->cond, &hevent->mutex, &abstime))
{
if (rc == ETIMEDOUT) break;
pthread_mutex_unlock(&hevent->mutex);
return -;
}
}
if (rc == && !hevent->manual_reset)
{
hevent->state = false;
}
if (pthread_mutex_unlock(&hevent->mutex) != )
{
return -;
}
if (rc == ETIMEDOUT)
{
//timeout return 1
return ;
}
//wait event success return 0
return ;
#endif
}
int event_set(event_handle hevent)
{
#ifdef _MSC_VER
return !SetEvent(hevent);
#else
if (pthread_mutex_lock(&hevent->mutex) != )
{
return -;
} hevent->state = true; if (hevent->manual_reset)
{
if(pthread_cond_broadcast(&hevent->cond))
{
return -;
}
}
else
{
if(pthread_cond_signal(&hevent->cond))
{
return -;
}
} if (pthread_mutex_unlock(&hevent->mutex) != )
{
return -;
} return ;
#endif
}
int event_reset(event_handle hevent)
{
#ifdef _MSC_VER
//ResetEvent 返回非零表示成功
if (ResetEvent(hevent))
{
return ;
}
return -;
#else
if (pthread_mutex_lock(&hevent->mutex) != )
{
return -;
} hevent->state = false; if (pthread_mutex_unlock(&hevent->mutex) != )
{
return -;
}
return ;
#endif
}
void event_destroy(event_handle hevent)
{
#ifdef _MSC_VER
CloseHandle(hevent);
#else
pthread_cond_destroy(&hevent->cond);
pthread_mutex_destroy(&hevent->mutex);
delete hevent;
#endif
}

最新文章

  1. CentOS7下安装chrome浏览器
  2. 深入.net(类及方法)
  3. UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc
  4. Hive Word count
  5. iOS团队开发者测试
  6. [LeetCode]题解(python):102 Binary Tree Level Order Traversal
  7. 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。
  8. poj 动态规划题目列表及总结
  9. mysql中的去除空格函数
  10. Android客户端与服务端交互之登陆示例
  11. codeforces432D Prefixes and Suffixes(kmp+dp)
  12. RobotFramework自动化测试框架-移动手机自动化测试Open Application关键字的使用
  13. JS 作用域(执行环境)与作用链---JS 学习笔记(二)
  14. Sqlserver tablediff的简单使用
  15. ubuntu14.04下播放器SMplayer的安装
  16. js混淆代码还原-js反混淆:利用js进行赋值实现
  17. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机模板
  18. 《快学Scala》第六章 对象 第七章 包和引入
  19. Tomcat+Apache集群方案
  20. nxp的layerscape系列芯片中的rcw指定了一些什么信息

热门文章

  1. java修饰符的权限范围
  2. 移动端自适应rem的设置
  3. Java设计RestfulApi接口,实现统一格式返回
  4. Python之logging.basicConfig函数各参数
  5. Leetcode Note
  6. C++分治策略实现快速排序
  7. 【转】ISE——完整工程的建立
  8. MSSQLSERVER 服务运行内存设置较小导致启动服务失败
  9. 安装macOS时遇到Unable to unmount volume for repair异常导致无法完成安装的解决办法
  10. Jenkins基于https的k8s配置