electron 窗口隐藏后 setTimeout setInterval 等延时函数出现执行间隔与定义好的延时时间出现巨大差距的问题

    一个electron项目,需要读写文件和操作硬件,所以我在主线程里面新建了两个BrowserWindow,一个BrowserWindow(windowA)主要负责与计算机底层做交互,另外一个BrowserWindow(windowB) 负责与用户之间的交互,两个BrowserWindow之间通过websocket进行消息交互。

   当windowB完全启动后,将windowA设置为隐藏,windowA.hide();在这样进行设置之后,出现了一个问题,所有和延时相关的操作,触发的时间都发生了严重的错误,例如在windowA中写这么一段代码:

print();

function print(){
    console.log('触发!');
    sendMsg('some str');
    setTimeout(print,200);
}

function sendMsg(str){
    //向browserWindowB发送一个ws消息
}

按正常的逻辑,browserWindowB应该每200ms收到一次消息,但是实际情况并不是这样,实际情况是browserWindowB大约每过1秒多钟才能收到一次消息,这个问题困扰了我两天,后面通过反复查看electron的文档和github查看electron的issue,终于解决了,解决方案有很多种,我这里公布我认为最简单的一种。

首先说一下出现这个问题的原因,electron认为,如果一个browserWindow被设置为隐藏或者最小化后,那么这个browserWindow应该就不需要过多的占用CPU资源,就会把这个browserWindow的事件循环线程的循环间隔加长(这里不清楚的同学可以看一下什么是JS的事件循环),所以触发的时间也会延长,我这边试了一下,大概触发的事件会变慢1秒钟左右,解决这个问题最简单的方式就是放弃使用JS原生的延时函数,转而使用nodejs提供的延时函数,nodejs原生提供了一个叫timers的库,我们直接引入替代掉JS原生提供的方法即可

const {setTimeout,setInterval,clearTimeout,clearInterval} = require('timers');

print();

function print(){
    console.log('触发!');
    sendMsg('some str');
    setTimeout(print,200);
}

function sendMsg(str){
    //向browserWindowB发送一个ws消息
}

加上第一行的引入后,会发现函数触发的时间变正常了,就是这么简单!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值