一条数据引发的问题

Posted smartneo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一条数据引发的问题相关的知识,希望对你有一定的参考价值。

问题点:需要统计三方软件使用的时长,但是要求在电脑处于休眠/睡眠状态下的时间段不能作为使用时长统计进去。

其实这个问题点有两个需要解决的问题:1、软件在使用的标准是什么?2、如何知道电脑什么时候从运行状态进入休眠/睡眠状态,或从休眠/睡眠状态进入运行状态?

问题一:软件在使用的标准,这个不是我今天主要讲解的重点,在这里只是提供一个简单的方案:拿到当前桌面显示的窗口(同一应用的不同窗口,只能作为一个应用),可以参考Windows自带的任务管理器查看到:

               技术图片

被红色线圈中的就是需要的。

问题二:如何知道电脑处于休眠/睡眠还是运行状态:

             1、windows系统是消息驱动,而且在Windows事件日志中记录着很多执行过的事件详细信息,其中就包括休眠/睡眠事件。

                  通过Windows系统自带的事件查看器,可以看到很多事件信息:发生时间、来源以及事件ID。

                 系统也为我们提供了相关的api获取需要的事件信息。ReadEventLog:读取指定的事件日志信息;

                  技术图片

             通过相关api,获取到系统休眠/睡眠时间,比较之前的休眠/睡眠时间,判断出电脑是否出从休眠/睡眠状态到运行状态。

                 好像问题就这么解决了,但是忽略了一个问题,就是时序的问题。如果每次计算软件使用时长都要去获取是否从休眠/睡眠到唤醒状态,存在这样一种情况:当运行到读取休眠/睡眠到幻想状态后,统计软件使用时长前,电脑休眠了,

                 等到唤醒后,就会将休眠的时间统计进去(如果设计的方式不够好的话)。

               2、Windows是靠消息驱动的,那么是否存在休眠/睡眠唤醒状态转换的消息呢,答案是有的,Windows就提供了相关的消息:WM_POWERBROADCAST  wparam参数确定了休眠/睡眠 唤醒状态。

                    只要在启动进程前创建一个窗口线程,监听这个消息,就能判断出状态是否发生改变,设置标志变量,进行逻辑处理。

参考资料:https://blog.csdn.net/wangkui1331/article/details/79446505

 

以上是关于一条数据引发的问题的主要内容,如果未能解决你的问题,请参考以下文章

一条忽略的告警引发的coredump

一条忽略的告警引发的coredump

脑洞大开--一条项目中常用的linux命令引发的经典算法题

某虚拟化项目总结:一条光纤引发的故障

一条sql语句引发mysql不停创建临时表的问题解决..coping to tmp table on desk

Antd Table 删除最后一页数据引发的序号问题