c++ 中多线程 以及 timer 的使用

C++多线程定时器完整实现 头文件: #pragma once #include #include #include //回调接口 typedef struct ITimerEngineCallBack { virtual bool OnTimerEngineCallBack( DWORD TimerID, DWORD Param ) = 0; }* ITimerEngineCallBackPtr; clas 阅读详情

RunCheckTaskThread() 开辟新的线程,在开辟新线程的时候为他创建了两种事件,一个是timer,一个是停止
CheckTask是新线程执行函数

.cpp文件

//任务检查线程
void Task::RunCheckTaskThread()
{
    //创建两个事件
    m_CheckTaskTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
    if (NULL==m_CheckTaskTimer)
    {
        MyException::ErrorMessage("[RunCheckTaskThread] CreateWaitableTimer Failed",REPORTERROR_POINTER_NULL);
    }

    m_CheckTaskStop = ::CreateEvent(NULL, TRUE, FALSE, NULL);
    if (NULL==m_CheckTaskStop)
    {
        MyException::ErrorMessage("[RunCheckTaskThread] CreateEvent Failed",REPORTERROR_POINTER_NULL);
    }

    //创建线程
    m_CheckTaskThread=(HANDLE)::_beginthreadex(NULL,0,(unsigned (__stdcall*)(void*))CheckTask,(LPVOID)this,0,NULL);
    if (NULL==m_CheckTaskThread)
    {
        MyException::ErrorMessage("_beginthreadex create Thread Failed",REPORTERROR_POINTER_NULL);
    }

}

//检查是否有打印任务
DWORD WINAPI CheckTask(PVOID lp)
{
    Task* myTask=Task::GetTaskInstance();
    //设置事件列表
    const int eventLen=2;
    HANDLE hEvent[eventLen] = {0};
    hEvent[0]=myTask->m_CheckTaskTimer;
    hEvent[1]=myTask->m_CheckTaskTimer;

    //设置timer
    LARGE_INTEGER dueTime;
    dueTime.QuadPart = 0;
    long lPeriod = 1000;
    ::SetWaitableTimer(myTask->m_CheckTaskTimer, &dueTime, lPeriod, NULL, NULL, 0);

    //进入timer循环
    while(1)
    {
        DWORD nRet = ::WaitForMultipleObjects(eventLen, hEvent, FALSE, INFINITE);
        if(WAIT_OBJECT_0 == nRet)
        {
            break;
        }
        else if(WAIT_OBJECT_0 + 1 == nRet)
        {   
            time_t curTime = time(NULL);
            //循环检查一遍是否有任务计划要执行
            for (TaskVec::iterator iter=g_PlanInfo.begin();iter!=g_PlanInfo.end();iter++)
            {
                //检查1s内的需要打印的计划
                if ((*iter).NextExcuteTime>curTime-1&&(*iter).NextExcuteTime<=curTime)
                {
                    myTask->Lock();
                    g_TaskQue.push(*iter);
                    myTask->UnLock();
                }
            }
        }

        ::CancelWaitableTimer(myTask->m_CheckTaskTimer);
        ::CloseHandle(myTask->m_CheckTaskTimer);
        myTask->m_CheckTaskTimer = NULL;

        ::CloseHandle(myTask->m_CheckTaskStop);
        myTask->m_CheckTaskStop = NULL;
    }

    return 0;
}

注意 下边的这两个函数都是静态的。
DWORD WINAPI CheckTask(PVOID lp);
Task::GetTaskInstance()

Windows平台C/C++毫秒级定时器实现详解 在Windows操作系统中,定时器是一种关键的异步通知机制,用于在指定时间间隔触发事件处理。系统主要提供两类定时器:窗口定时器和系统定时器。窗口定时器通过SetTimer创建,依赖消息循环,当时间到达时,系统向指定窗口过程(WndProc)投递WM_TIMER消息,适合GUI应用中的周期性任务,如界面刷新;而系统定时器(如)工作于内核层面,支持高精度、可等待的定时操作,适用于需要微秒级精度或跨线程同步的场景。二者本质差异在于:窗口定时器。 阅读详情

相关推荐

用线程实现的定时器Timer

用vc实现的基于线程的定时器Timer,通常vc++的定时器timer是基于窗体的,由窗体消息驱动,而本程序实现的timer是基于线程的,不用windows消息驱动,而是基于线程事件驱动的

C++:定时器OnTimer和多线程的使用

C++:定时器OnTimer和多线程的使用

hiteryang的博客 3348

C++使用onTimer()函数编写的秒表

内容索引:VC/C++源码,系统相关,秒表  C++使用onTimer()函数编写的秒表,时、分、秒、微秒都能设置,点击开始按钮,秒表就开始走动了,窗体上的那几个按钮做的相当漂亮,不少朋友以前专一做出这种按钮,今天竟然在这个秒表中发现了,幸运。

C++中利用多线程实现定时器

使用多线程技术实现了一个简单的定时器类: <br /> <br />        /********CTimer.h***********/<br /> <br /> #ifndef CTIMER_H_ #define CTIMER_H_ #include <Windows.h> class CTimer { public: CTimer(); ~CTimer(); void StartTimer(unsign

markman101---神即是道 道法自然 如来 7443

基于ZYNQ7020芯片(黑金开发板AX7020)之AXI-FULL DDR的PL与PS交互操作。

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断。此测试工程得到以前知识的总结和各大网友的支持,只希望可以为学习的你更进一步,大家一起学习才是真的开心。加油,国产芯片之路。

landyjzlai的博客 3190

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 397

【多线程基础】 定时器Timer的使用及实现

定时器相当于一个任务管理器。有些任务可能现在执行, 有些任务可能过1个小时,甚至很久才会执行。定时器就是对这些任务进行管理监视, 如果一个任务执行时间到了,定时器就会将这个任务执行。 保证所有的任务都会在合适的时间执行。

书生-w的博客 2万+

单细胞分析避坑指南:你的Harmony批次矫正真的做对了吗?

本文深入探讨了单细胞转录组分析中Harmony批次矫正的正确使用方法,解析了其工作原理及常见误区。通过详细参数调优指南和实战案例,帮助研究者避免过度矫正,确保生物学信号的有效保留。特别关注Harmony在单细胞数据分析中的关键参数设置和结果验证方法。

weixin_31099291的博客 299

C++Asio库学习 Timer.4~5

先前4个示例避免了handler的同步问题,通过只在一个线程中调用io_context::run()函数。strand 类模板是一个执行器适配器,可以保证通过它分派的handler,在下一个handler启动之前,一个正在执行的handler将被允许完成。这个asio::bind_executor()函数返回一个新的handler,它可以通过strand对象自动分发它所包含的handler。主函数现在在两个线程中触发io_context::run()函数,一个在主函数中,另一个在额外的线程中。

destiny44123的博客 1332

【论文学习】《Fully-Convolutional Siamese Networks for Object Tracking》2016年SiamFC 全卷积孪生网络用于目标跟踪

在这项工作中,我们脱离了跟踪中采用的传统在线学习方法,并展示了一种专注于在离线阶段学习强嵌入的替代方法。与在分类设置中的使用不同,我们证明,对于跟踪应用,孪生全卷积深度网络能够更有效地使用可用数据。这不仅反映在测试时,通过执行有效的空间搜索,也反映在训练时,其中每个子窗口都有效地代表一个有用的样本,而几乎没有额外的成本。实验表明,深度嵌入为在线跟踪器提供了自然丰富的特征来源,并使简单的测试时策略表现良好。我们相信这种方法是对更复杂的在线跟踪方法的补充,并期望未来的工作能够更彻底地探索这种关系。

SkyLeopard的博客 2419

基-2 16点fft的verilog实现

本文是采用输入8位数据,输出8位数据的16点fft实现,旋转因子采用8位rom存储,分为cos和sin2个rom存储;输入数据以及每一级的输出数据采用8位的ram进行存储,分为实部和虚部进行存储。采用顺序输入,那么输出则为倒序。生成rom,可先在matlab中,计算出cos和sin的值,然后写入coe文件,再由ip核生成,具体过程自行百度,懒得百度的话,可以发我的邮箱来获得具体的程序。因为本文采用...

juniorofMFC的博客 9991

多线程nxtimer定时器改单线程uv_timer定时器 C C++混合编程

这段代码实现了从nxtimer到uv_timer定时器的转换,并处理了C/C++混合编程的问题。核心功能是实现单线程定时器。 主要修改点包括: 将nxtimer替换为libuv的uv_timer_t,避免多线程问题 使用C++类封装定时器逻辑(BrightnessTimer) 通过extern "C"提供C语言兼容接口 使用智能指针管理定时器资源 实现了状态管理函数供C代码调用 定时器逻辑被封装在BrightnessTimer类中,通过handleTou

Obamaaaa的博客 349

把 MANDT 锁进保险箱:ABAP Client Handling 与 Client Isolation(聚焦 AMDP 的 Client Safety )

本文探讨了ABAP系统中Client Handling与Client Isolation机制的演进,重点分析了AMDP环境下多租户隔离的风险与解决方案。传统ABAP SQL/CDS通过隐式Client过滤提供安全保障,而AMDP因其原生SQLScript特性容易绕过隔离机制。文章对比了旧时代依赖开发自觉的传参方式与新时代通过AMDP OPTIONS强约束的语法方案,详细介绍了CLIENT INDEPENDENT和CDS SESSION CLIENT DEPENDENT两种编译期安全机制,阐述了USING列表

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 341

C++boost之asio strand

以c++ boost 1.66版本为例,类boost::asio::io_context::strand的主要作用是在asio中利用多线程进行事件处理的时候,如果涉及到多线程访问共享资源,借助于strand类,我们不需要显示的使用线程同步相关的类(比如mutex)就可以让多个事件处理函数依次执行。 简而言之,strand定义了事件处理程序的严格顺序调用。 我们知道,若多个线程调用了同一个io_...

u010005508的专栏 1万+

【AI for Medecine】吴恩达医学图像AI专项课程(诊断、预测、治疗)

近期需要简单了解AI4Science上的一些应用,看到吴恩达大佬的专项课程,于是开始来个“全面”的了解--医学人工智能(诊断、预测、治疗)。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 772

Windows 上 openclaw onboard --install-daemon 命令的安装位置和启动配置

摘要:Windows系统中,执行openclaw-cnonboard--install-daemon命令会创建计划任务OpenClawGateway,该任务在用户登录时自动运行位于%USERPROFILE%.openclaw\gateway.cmd的脚本文件来启动服务。管理方法包括通过任务计划程序或命令行(schtasks)查看/启停任务,使用openclaw gateway命令操作服务,或通过删除计划任务和脚本文件完全卸载服务。该机制确保OpenClawGateway服务随系统登录自动启动。(149字)

大坡3D软件开发 1374

ROS 2 C++ 原生读取 bag 文件实战指南

ROS 2 bag 文件是机器人数据记录与回放的核心载体,其底层基于 SQLite 存储与 CDR 序列化机制。理解 bag 的存储结构、时间戳对齐原理及序列化/反序列化链路,是实现高精度离线仿真、SLAM 评估和嵌入式数据解析的技术基础。相比 CLI 工具 ros2 bag play,C++ 原生 API(如 rosbag2_cpp::Reader 和 rosbag2_transport::ReaderWriterFactory)提供细粒度控制能力,支持逐帧读取、消息过滤、跨线程安全访问与无 ROS 运行

weixin_33743248的博客 366

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Boost中timer计时器详解和代码示例

w:wall%u:user%s:system%t:CPU 总时间n是小数精度,pattern为格式字符串。

qq_36812406的博客 1376

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

UE4里面的线程问题的思考/UE4里面的delay是如何实现的

  因为要做性能优化,所以,本来项目里面很多用蓝图实现的方法需要用cpp来实现,但是之前的一些需要延时的Event却不好在Cpp实现; 1.据我所知,在虚幻引擎中Functions和Events是两种完全不同的概念。     Events是区分于主线程的单独的线程,不能有任何的返回值,而且是可以执行有延时的方法,比如说delay;     而Function不像Events那样,他仍然是执...

liuqiqi0071的博客 4938

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设定Linux C/C++ 程序的执行时限

给Linux C/C++程序设定执行时限 时间管理,是每个现代人的必修课。给一个任务固定的执行时间,是控制整体进度的一种常用方法。 回到程序中: 如何让一个运行时间可能比较长的Linux C/C++程序能够有一个执行时限呢?这就是本文想解答的一个问题。 最直接的方法就是起一个timer,并且安装 SIGRTMIN 信号的处理函数;然后在这个信号处理函数里获取本进程的pid,再向本进程发送 SIGTERM 信号来杀死自己。 具体代码如下: // g++ timer.cpp -lrt #include &l

FinixLei的专栏 (https://github.com/FinixLei) 2433

boost::asio::io_context, boost::asio::steady_timer定时器

函数用于注册一个异步等待操作,当定时器到期时,给定的回调函数会被调用。在回调函数中,我们检查错误代码,如果没有错误,则输出一条消息。,并设置了它在5秒后过期。然后我们注册了一个异步等待操作,并在定时器到期时会打印一条消息。的构造函数接受一个时间参数,这个参数表示定时器何时应该过期。在这个例子中,我们使用了。,可以用来在给定的时间点执行一个函数或者是在一个固定的时间间隔后执行一个函数。是执行异步操作所必需的,它会阻塞直到所有注册的异步操作都完成。在这个例子中,我们创建了一个。)关联的,因此在创建。

sun007700的专栏 934

C++实现自定义的性能分析器:利用操作系统提供的API进行低开销采样

大家好!今天我们来探讨如何使用 C++ 构建一个自定义的性能分析器,侧重于利用操作系统提供的 API 进行低开销采样。性能分析对于识别代码中的瓶颈至关重要,尤其是在性能敏感的应用中。传统的侵入式分析方法可能会引入显著的开销,影响程序的真实行为。而基于采样的分析方法则通过定期中断程序执行,记录关键信息,从而以较低的开销估算程序性能。通过本文,我们了解了如何使用 C++ 构建一个自定义的性能分析器,利用操作系统提供的 API 进行低开销采样。我们分别使用了setitimer和两种方法。setitimer。

weixin_41455464的博客 462

C++ Boost库:计时器 timer

文章目录1. timer类2. cpu_timer类 1. timer类 timer是一个很小的库,提供简单的时间度量和进度显示功能,也可用于性能测试等计时任务。timer库包含三个组件:计时器类timer、progress_timer和进度指示类progress_display。 timer类可以测量时间的流逝;是一个小型的计时器,提供毫秒级别的计时精度和操作函数,它最大可表示的时间间隔约为596小时,它位于boost命名空间下。使用时需要包含头文件: #include<boost/timer.hp

超级大洋葱的博客 7130

C++11实现简易定时器

定时器timer是多线程编程中经常设计到的工具类 定时器的原理其实很简单: 创建一个新线程 在那个线程里等待 等待指定时长后后做任务 这里用C++11实现了一个简单易用的定时器,包含两种模式: 周期性定时任务执行 单次延时任务执行 timer.hpp #ifndef _TIMER_H_ #define _TIMER_H_ #include <functional> #incl...

踏莎行的博客 9471

C语言定时器代替多线程,【已解决】C++多线程定时器/计时器/Timer C++ Multithread Timer | 勤奋的小青蛙...

参考:http://codereview.stackexchange.com/questions/40915/simple-multithread-timer本文实现了一个多线程C++定时器,具备设置singleshot,start(),stop()等功能。代码如下:Timer.h:#ifndef TIMER_H#define TIMER_H#include #include class Time...

weixin_39818662的博客 620
上一篇: 好的网站收藏
下一篇: 如何写好一篇博客
writeeee
博客等级 码龄18年 35粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值