【问题标题】:Using node.js os.cpus() to detect user idle time?使用 node.js os.cpus() 检测用户空闲时间?
【发布时间】:2013-03-28 23:17:33
【问题描述】:

我正在开发一个使用 node.js 作为平台的 appjs 聊天应用程序。我一直在检测计算机何时空闲(当用户离开或不使用它时)。

node.js 中有 os 模块,它的os.cpus() 为每个核心提供了这样的信息:

[ { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 252020,
       nice: 0,
       sys: 30340,
       idle: 1070356870,
       irq: 0 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 306960,
       nice: 0,
       sys: 26980,
       idle: 1071569080,
       irq: 0 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 248450,
       nice: 0,
       sys: 21750,
       idle: 1070919370,
       irq: 0 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 256880,
       nice: 0,
       sys: 19430,
       idle: 1070905480,
       irq: 20 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 511580,
       nice: 20,
       sys: 40900,
       idle: 1070842510,
       irq: 0 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 291660,
       nice: 0,
       sys: 34360,
       idle: 1070888000,
       irq: 10 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 308260,
       nice: 0,
       sys: 55410,
       idle: 1071129970,
       irq: 880 } },
  { model: 'Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz',
    speed: 2926,
    times:
     { user: 266450,
       nice: 1480,
       sys: 34920,
       idle: 1072572010,
       irq: 30 } } 
]

那么它适合检测用户空闲吗?据我了解,我可以使用两个值:useridleidle 值迭代非常快,但 user 值以混乱的方式迭代。我正在寻找的是知道用户何时不移动鼠标或不输入任何应用程序(不仅在我的应用程序中)并且在一些阈值超时(例如 60 秒)不活动后我需要将他的状态更改为“离开”当他回来时,将其改回“在线”。您能否指出一些算法如何做到这一点,甚至为我放弃一些代码示例? 提前致谢。

编辑。 据我所知,每个操作系统都有 API 来检测用户是否空闲,例如作为平台的 Adob​​e Air 有能力轻松做到这一点,我知道我可以使用 node-ffi 甚至编写一个模块。此外,据我所知,Chromium 也有这种能力out of the box

【问题讨论】:

  • 为了帮助我们帮助您,为什么 nodejs 应用程序会关心整个计算机是否空闲?结局是什么?可能有更好的方法来做你正在尝试的事情,而你却忽略了,因为你已经在这种特殊的方法上陷入了困境。
  • 作为一个网络应用程序,如果我不经常使用该应用程序,我希望它将我的状态设置为离开。就像 StackExchange 聊天的工作方式一样,当我离开聊天 15 分钟后,我在标签本身中显示为“离开”。
  • 所以你打算针对一个高度选择的群体在本地运行 nodejs,还是 appjs 打包并独立运行各种版本的 node?诚然,我没有研究过 appjs,因为我不认为这是一个功能强大的桌面运行时,但又不是 Java ;-) 说真的,我的意思是,如果你打算将它作为桌面客户端运行那么是的,像top 一样监控CPU 的低使用率。但是您必须为该值保留一个阈值,例如 4% 或其他值。遗憾的是,您不能为活动挂钩鼠标/kbd 驱动程序堆栈......
  • 请记住,Outlook 可能会在后台启动并使用 CPU,或者屏幕保护程序可能会使用 CPU,或者网络文件副本等。
  • 这可能有助于确定阈值:stackoverflow.com/questions/15929790/…

标签: node.js appjs


【解决方案1】:

根据 os.cpus() documentation

返回一个对象数组,其中包含有关每个 CPU/内核的信息 已安装:型号、速度(以 MHz 为单位)和时间(包含 CPU/核心花费的毫秒数:user, nice, sys, idle, 和中断)。

所以times 字段显示了在 CPU 内核上花费的所有时间以及它自启动以来的使用情况。但这不是您要查找的内容,因为输出详细说明了系统的 CPU 使用情况,而不是 appjs 窗口的详细信息。

现在如何确定您的 appjs 应用程序是否处于活动/空闲状态。您应该检查 appjs page。您可以在应用程序中使用一些事件,例如 mousemovekeydown

  window.addEventListener('keydown', function(e){
  //if last trigger is there remove it and add new trigger
  //else call makeactive()
  });

  window.addEventListener('mousemove', function(e){
  //if last trigger is there remove it and add new trigger
  //else call makeactive()
  });

//To trigger timeout activity do something like this 
setTimeout(function () {
//change icons, set status as away.
}, 60000); // after 60 seconds timeout

//To reset inactivity changes if it is already idle
makeactive(){
//reset icons, set status as active.
}

【讨论】:

  • 对不起,如果我没有彻底解释清楚。用户空闲我的意思是全局用户不活动不仅适用于 appjs 窗口,因此 javascript 鼠标和键盘事件不适合。
  • CPU 空闲时间是一个很好的衡量标准。如果 CPU 长时间处于空闲状态,则表示用户没有在做严重的事情,或者他根本没有使用系统。
  • @MortezaM。不,这不是真的,因为可能存在 CPU 空闲但用户正在使用计算机的情况。想想“阅读 PDF”。
  • 还有一些后台服务/作业会占用 CPU 周期。那么如果后台作业正在消耗 CPU,如何告诉用户空闲。您必须使用系统命令来找出例如 'w' in linux
  • 大家好,感谢您的约会,如果这个 cpu 空闲数据对我的任务有好处,请您指点我一些算法,我如何从这些递增值中确定用户空闲,因为老实说我不明白这个 cpu 的东西是如何工作的?
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2012-09-20
  • 2015-01-25
  • 2017-05-07
  • 1970-01-01
  • 2010-11-13
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多