#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//return value: NULL error event_handle event_create (bool manual_reset, BOOL init_state) ;//Return value: 0 Wait for event, 1 error int event_wait (Event_handle hevent);//return value: 0 Wait for event, 1 timeout,-1 error int event_timedwait (Event_handle hevent, long milliseconds);//return value: 0 successful, 1 error int event_set (Event_handle hevent);//Return value: 0 success, 1 error int Event_reset (event_handle hevent);//return value: No 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_res ET, 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 0; } return-1; #else if (Pthread_mutex_lock (&hevent->mutex)) {return-1; } while (!hevent->state) {if (Pthread_cond_wait (&hevent->cond, &hevent->mutex) ) {Pthread_mutex_unlock (&hevent->mutex); return-1; }} if (!hevent->manual_reset) { Hevent->state = false; } if (Pthread_mutex_unlock (&hevent->mutex)) {return-1; } return 0; #endif}int event_timedwait (Event_handle hevent, long milliseconds) {#ifdef _msc_ver DWORD ret = waitfors Ingleobject (hevent, milliseconds); if (ret = = wait_object_0) {return 0; } if (ret = = wait_timeout) {return 1; } return-1; #else int rc = 0; struct Timespec abstime; struct Timeval TV; Gettimeofday (&TV, NULL); Abstime.tv_sec = tv.tv_sec + milliseconds/1000; Abstime.tv_nsec = tv.tv_usec*1000 + (milliseconds% 1000) *1000000; if (abstime.tv_nsec >= 1000000000) {abstime.tv_nsec-= 1000000000; abstime.tv_sec++; } if (Pthread_mutex_lock (&hevent->mutex)! = 0) {return-1; } while (!hevent->state) {if (rc = pthread_cond_timedwait (&hevent->cond, &hevent- >mutex, &abstime)) {if (rc = = etimedout) break; Pthread_mutex_unlock (&hevent->mutex); return-1; }} if (rc = = 0 &&!hevent->manual_reset) {hevent->state = false; } if (Pthread_mutex_unlock (&hevent->mutex)! = 0) {return-1; } if (rc = = etimedout) {//timeout return 1 return 1; }//wait Event success return 0 return 0; #endif}int event_set (Event_handle hevent) {#ifdef _msc_ver return! SetEvent (hevent); #else if (Pthread_mutex_lock (&hevent->mutex)! = 0) {return-1; } hevent->state = true; if (Hevent->manual_reset) {if (Pthread_cond_broadcast (&hevent->cond)) {return-1; }} else {if (pthread_cond_signal (&hevent->cond)) {return-1; }} if (Pthread_mutex_unlock (&hevent->mutex)! = 0) {return-1; } return 0; #endif}int event_reset (Event_handle hevent) {#ifdef _msc_ver//resetevent returns nonzero for success if (ResetEvent (heve NT)) {return 0; } return-1; #else if (Pthread_mutex_lock (&hevent->mutex)! = 0) {return-1; } hevent->state = false; if (Pthread_mutex_unlock (&hevent->mutex)! = 0) {return-1; } return 0; #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}
Cross-platform event events Windows Linux