在 IE 中轮询的好的 setTimeout 间隔是多少?

Posted

技术标签:

【中文标题】在 IE 中轮询的好的 setTimeout 间隔是多少?【英文标题】:What is a good setTimeout interval for polling in a IE? 【发布时间】:2010-08-29 21:11:33 【问题描述】:

我有一个在浏览器 (IE) 中运行的 ActiveX 对象(我有他的源代码)。 ActiveX 对象有一个引发事件的 UI。我想在浏览器中响应这些事件。

我不想从 ActiveX 对象事件中调用 javascript 函数:因此,我希望 JavaScript 轮询 ActiveX 对象的方法(例如,“您有任何要报告的事件吗?”) .

我会用这样的代码来做到这一点:

function findActiveXObject() 
    return document.getElementById('MyActiveXObject');

function startPolling() 
    setTimeout('pollForEvents()', 100);

function pollForEvents() 
    var activeXObject = findActiveXObject();
    var eventMsg = activeXObject.PollForEvent();
    if (eventMsg != null)
    
        //do something with the event
        alert(eventMsg);
    
    //poll again soon
    startPolling();

什么是好的轮询间隔?

我猜,虽然我不确定,工作量很小:它只是调用一个 ActiveX 对象的方法,它要么返回一个已经缓存的字符串,要么返回 null。

我想经常轮询:这样浏览器(实际上是 JavaScript)就可以迅速响应 ActiveX 对象中的 UI 事件。

100 毫秒太小了吗? 50 毫秒怎么样?

以 100 毫秒的间隔,我在浏览器中看到的 CPU 利用率只有 1%:但这只是在我的机器上。一般情况下(运行 IE 的台式机)呢?

如果这是一个本机线程,我不会担心每 50 毫秒唤醒它一次,但我在 IE 中运行 JavaScript 的经验很少。

【问题讨论】:

【参考方案1】:

我建议每秒轮询一次。 你真的需要即时反应吗?

另外,您不应将字符串传递给setTimeout。 相反,您应该传递函数本身,例如 htis:

setTimeout(pollForEvents, 1000);

【讨论】:

我不能更频繁地投票吗?如果不是,那为什么不,或者在什么情况下我不应该?当用户单击 ActiveX 对象中的某些内容时,我希望页面上的其他内容“显然是瞬间”响应该用户输入(因此只有一小部分时间)。 一方面,我相信任何更频繁的事情都会干扰节能机制。 “你真的需要即时反应吗?”通常,当我编写 UI 时,我设计/更喜欢它是快速/响应式的。否则用户点击某些东西,什么也没有发生,他们就像“???”。 我可以看出你可能是对的,理论上;但我有限的谷歌搜索并没有发现提到设置定时器间隔和降低功率之间的直接关系。我不知情的猜测是,节能是由平均 CPU 利用率控制的(平均利用率似乎很低,即使是 100 毫秒,至少在我的机器上是这样)。【参考方案2】:

从 1 秒开始,然后,看看你的反应如何。

如果您需要更快,请减少超时时间,但是,您可能会发现低于 20-50 毫秒您不会得到任何改进,因为操作系统和时间片,因此线程可以获得足够的时间。

我怀疑你会看到很多 cpu 利用率,如果你没有做太多,因为如果它需要 1 毫秒来完成操作,而且它可能会更快,那么你大部分时间都在睡觉,为此。

但是,这真的取决于用户体验,这是主观的。一个人可以接受的事情在其他人看来可能很慢。

因此,找到您认为合适的值,然后请朋友尝试一下,看看他们对反应的看法。如果没有任何好处,仅仅因为你可以而加快速度是没有意义的。

【讨论】:

100 毫秒实际上是瞬时的(小于人眼-手的反应时间),200 毫秒很快但很明显,1000 毫秒是整个心跳甚至更长。你预见到 100 毫秒有什么问题吗? @ChrisW - 我使用 50ms 没有任何问题,对于某些浏览器我使用 20ms 没有任何问题,所以 100ms 应该没问题,但是,这取决于其他情况页。例如,一个 1 秒的计时器只需要大约 500 毫秒,即可准确计时。 好的,谢谢。我的偏好是事件处理程序而不是轮询;但是 .NET 安全性不允许我通过 ActiveX 接口从对象内部调用(我想它不知道在接口另一侧运行的是“安全”JavaScript,而不是非托管代码)。 【参考方案3】:

这取决于 - 您希望 ActiveX 对象响应的速度。 - 使 CPU 保持忙碌的其他因素(flash 动画、其他轮询函数)

由于其他因素,区间值不能反映实际值。因此,在您的机器中,较低的值似乎是正确的,但您无法确定其他客户的确定性。我建议您尽可能增加间隔。如果一秒钟就足够了,那很好。

【讨论】:

以上是关于在 IE 中轮询的好的 setTimeout 间隔是多少?的主要内容,如果未能解决你的问题,请参考以下文章

以轮询的间隔执行代码

在 erlang 中轮询接收块是一种好的做法吗?

服务器推Comet长轮询的方式与普通AJAX不断请求的方式的区别

vue分页列表轮询解决方案

在哪里可以找到演示轮询的优秀 C# 控制台应用程序?

如何在不轮询的情况下监视页面的更改?