跨平台的EVENT事件 windows linux(转)

#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 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 = WaitForSingleObject(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 返回非零表示成功
    if (ResetEvent(hevent))
    {
        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
} 
时间: 2024-10-28 09:42:52

跨平台的EVENT事件 windows linux(转)的相关文章

跨平台的EVENT事件 windows linux

#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; #

使用Active Database Duplication创建跨平台Data Guard设置 (Windows/Linux) (Doc ID 881421.1)

Using Active Database Duplication to Create Cross Platform Data Guard Setup (Windows/Linux) (Doc ID 881421.1) APPLIES TO: Oracle Database Cloud Exadata Service - Version N/A and laterOracle Database Cloud Service - Version N/A and laterOracle Databas

linux下input event事件,可以用后台截取键盘按下的键值,后台截取数据.....input.h

如何读取Linux键值,输入子系统,key,dev/input/event,dev/event,C语言键盘? 这里先上一段代码,自己拿到linux系统运行就可以,注意代码中keys_fd = open("/dev/input/event2", O_RDONLY);      这里去你的/dev/input/event2的event事件,去查看你的键盘事件是那一个,如果是event3那么你改成event3好了.这里给一个命令你去查看 cat  /proc/bus/usb/devices

JS之Event事件

<script> function ff(event) { var e = window.event||event;//Event对象:发生当前事件的状态 // var src = e.srcElement||e.target;//获得事件中的value值 var c = e.keycode||e.charCode;//获得键盘输入的值的编码 // alert(e); // alert(src.value); alert(c); } /** var e; if(window.event){ e

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

IDA Pro Disassembler 6.8.15.413 (Windows, Linux, Mac)

IDA: What's new in 6.8 Highlights This is mainly a maintenance release, so our focus was on fixing bugs. However, there are some improvements too: Support for long names. In previous versions of IDA names were limited to 511 bytes. This was causing p

Event事件详解

首先提到event,先要明白event的产生,也要先明白焦点,什么是焦点.焦点 : 使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入. 我们可以通过一些方式给元素设置焦点.而并不是所有元素都能够接收焦点的,能够响应用户操作的元素才有焦点.例如: <input type="text" /> <a href="http://www.baidu.com">百度</a> 说到input,平时用的较多的是o

Windows+Linux安装Python工具setuptools

Windows+Linux安装Python工具setuptools setuptools是 Python Enterprise Application Kit(PEAK)的一个副项目,它 是一组Python的 distutilsde工具的增强工具(适用于 Python 2.3.5 以上的版本,64 位平台则适用于 Python 2.4 以上的版本),可以让程序员更方便的创建和发布 Python 包,特别是那些对其它包具有依赖性的状况. 经常接触Python可能会注意到,当需要安装第三方pytho

COMSOL Multiphysics 4.4 Update 1 Multilanguage Windows.&.Linux.&.MacOSX 1CD

GH BLAEDE 风力机性能和载荷计算的集成化软件包 用户界面直观 提供综合模型 空气动力模型 控制系统应用 动力响应等 多种用途 ProgeCAD.2013.Professional.v13.0.16.21 1CD PROKON.v2.6.14 1CD  IBM.SPSS.Amos.v22 1CD IBM.SPSS.Data.Collection.v7.Win32 1CD IBM.SPSS.Data.Collection.v7.Win64 1CD IBM.SPSS.Statistics.v2