跨平台的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-12-23 04:22:28

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

跨平台PowerShell如何远程管理Linux/Mac/Windows?

 跨平台PowerShell如何远程管理Linux/Mac/Windows? 首先,在要管理的机器上安装跨平台PowerShell:https://github.com/PowerShell/PowerShell/releases 如何安装呢?看Instructions: Platform Downloads How to Install Windows 10 / Server 2016 .msi Instructions Windows 8.1 / Server 2012 R2 .msi

PostgreSQL Windows\Linux\FreeBSD的数据文件通用吗

标签 PostgreSQL , Linux , Windows , 数据文件 , 存储格式 背景 PostgreSQL是一个跨平台的数据库,比如支持WindowS, AIX , linux , freebsd等. 同时也支持不同架构例如X86,ARM等. 对于相同架构,不同平台,是否能实现文件级别的平移,甚至物理的流复制搭建STANDBY呢? 理论上从数据库的存储层面来看,如果两个平台存储结构(比如堆表.索引.WAL日志,CLOG等)一致,是可以平移的. 比如Windows,Linux,都是x6

云服务器 ECS 数据恢复:磁盘空间满的问题处理(Windows /Linux ) 及最佳实践

磁盘空间满的问题处理(Windows /Linux ) 及最佳实践 磁盘空间满的问题处理(Windows /Linux)及最佳实践 本文主要介绍window.Linux系统磁盘空间不足时对应的处理方法. 适用对象 适用于使用阿里云ECS的用户. 主要内容 云服务器 ECS Linux磁盘空间满排查处理 云服务器 ECS window磁盘空间满排查处理 ECS Linux磁盘空间满排查处理 Windows磁盘空间满排查处理 解决Windows磁盘空间满的问题,有以下处理方式: 释放磁盘空间 扩充磁

ubuntu14 04-实现windows linux双系统的目标,重启机器时出现file not found问题

问题描述 实现windows linux双系统的目标,重启机器时出现file not found问题 通过硬盘安装乌班图时,首先要对某一个磁盘腾出20-30G的空间,按步骤操作腾出这一空间大小,然后使用easybcd进行引导,但重启之后一直出现一个问题,"Filesystem type is ntfs,partition type 0x42,error 15:file not found"请问之前腾出的空间是后期用来存放乌班图系统的吧,至于那些安装包,比如镜像文件等放在哪个磁盘都OK吧

Windows Linux 删除N天之前的文件脚本

                             Windows Linux 删除N天之前的文件脚本    通常做为备份服务器经常会存放非常多的历史文件,而这些文件又并非需要长期而永久的保存,只需保存备份后恢复所需的文件,这个时候就需要定期删除过期而无效的备份文件. Windows 下删除方式如下: forfiles /p d:\OraBackups\prudenwoo /m * /d -7 /c "cmd /c del @file"   forfiles /p d:\OraB

log4j windows linux 日志分割问题

问题描述 log4j windows linux 日志分割问题 求大神:项目中遇到很大的一个问题.log4j DailyRollingFileAppender '.'yyyy-MM-dd-HH-mm, 每分钟分割为一个文件. 以前在windows上运行正常,现在怎么都不分割,无论过了多少分钟.但是,在我的MAC上,准确按分钟分割出来了.求解!急!!! 解决方案 log4j DailyRollingFileAppender 不支持多进程,是不是在多个进程中处理了 解决方案二: 不是多线程造成的.M

javascript中window.event事件用法详解_基础知识

前两天写程序时因为要用到javascript中的window.event事件,于是就在网上搜了一下,终于找到一篇不错的文章,来与大家分享下: 描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义. 例子下面的例子检查鼠标是否在链接上单击,并且,如

深入解析PHP的Yii框架中的event事件机制_php技巧

事件事件可以将自定义代码"注入"到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如,邮件程序对象成功发出消息时可触发 messageSent 事件.如想追踪成功发送的消息,可以附加相应追踪代码到messageSent 事件. Yii 引入了名为 yii\base\Component 的基类以支持事件.如果一个类需要触发事件就应该继承 yii\base\Component 或其子类. Yii的event机制YII的事件机制,是其比较独特之处

浅析javascript中的Event事件_javascript技巧

1.焦点:当一个元素有焦点的时候,那么他就可以接受用户的输入(不是所有元素都能接受焦点) 给元素设置焦点的方式:    1.点击 2.tab 3.js 2.(例子:输入框提示文字) onfocus:当元素获取焦点时触发:        element.onfocus = function(){};   onblur:当元素失去焦点时触发:        element.onblur = function(){};    obj.focus() 给指定的元素设置焦点 obj.blur() 取消指定