跨平台的EVENT事件 windows linux

2021-06-07 09:51:00 字數 2666 閱讀 2703

#ifndef _hik_event_h_ 

#define _hik_event_h_

#ifdef _msc_ver

#include #define hik_event_handle handle

#else

#include typedef struct

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#include "event.h"

#ifdef __linux

#include #include #endif

#include event_handle event_create(bool manual_reset, bool init_state)

hevent->state = init_state;

hevent->manual_reset = manual_reset;

if (pthread_mutex_init(&hevent->mutex, null))

if (pthread_cond_init(&hevent->cond, null))

#endif

return hevent;

}int event_wait(event_handle hevent)

return -1;

#else

if (pthread_mutex_lock(&hevent->mutex))

while (!hevent->state)

}

if (!hevent->manual_reset)

if (pthread_mutex_unlock(&hevent->mutex))

return 0;

#endif

}int event_timedwait(event_handle hevent, long milliseconds)

if (ret == wait_timeout)

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)

if (pthread_mutex_lock(&hevent->mutex) != 0)

while (!hevent->state)

}

if (rc == 0 && !hevent->manual_reset)

if (pthread_mutex_unlock(&hevent->mutex) != 0)

if (rc == etimedout)

//wait event success return 0

return 0;

#endif

}int event_set(event_handle hevent)

hevent->state = true;

if (hevent->manual_reset)

}else

}if (pthread_mutex_unlock(&hevent->mutex) != 0)

return 0;

#endif

}int event_reset(event_handle hevent)

return -1;

#else

if (pthread_mutex_lock(&hevent->mutex) != 0)

hevent->state = false;

if (pthread_mutex_unlock(&hevent->mutex) != 0)

return 0;

#endif

}void event_destroy(event_handle hevent)

event 事件的使用

event用於兩個執行緒間的協作,比如乙個執行緒得到了資料發訊號給另乙個執行緒讓它來處理 多執行緒裡的event from threading import thread,event import time,random event event def light print light is li...

跨所有瀏覽器的event事件工具類

跨所有瀏覽器的event事件工具類 var eventutil else if element.attachevent else element 要操作的元素,事件名稱,事件處理程式函式 removehandler function element,type,handler else if elem...

C 跨平台事件機制實現

今天看到有人在討論c 標準沒有提供類似作業系統層次的事件通知機制,如windows的事件核心物件。其實我想說的事,c 11標準裡的互斥量及條件變數已經夠幫我們實現類似的功能了。剛編寫了乙個事件通知類新鮮出爐,供大家把玩一下,一起學習併發執行緒的編寫。寫的有不好的地方,請一定要不吝惜指出來,我會改正,...