一个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消息
}
加上第一行的引入后,会发现函数触发的时间变正常了,就是这么简单!