前端定时器在置于后台状态,不需要睡眠的需求

一、项目需求:微信公众号嵌入网页应用,应用中存在倒计时功能,当应用被置于后台或息屏状态,定时器被睡眠。

二、基于需求写了网页定时器:this.setInterval = setInterval(() => {},times);

       [问题]:应用被挂起,定时器停止;

三、解决方案:

       1、JavaScript多线程之HTML5 Web Worker

createWorker(callback, time){   // 创建线程

        let create = function(f) {

          var blob = new Blob(['(' + f +')()']);

          var url = window.URL.createObjectURL(blob);

          var worker = new Worker(url);

          return worker;

        };

        var pollingWorker = create(`function (e) {

          setInterval(function () {

              this.postMessage(null)

          }, ${time})

        }`);

        pollingWorker.onmessage = callback

        return pollingWorker;

    },

    stopWorker(vm){  // 终止线程

      try {

        vm&&vm.terminate()

      } catch (err) {}

    },

应用线程,但是在销毁的时候,也要再次销毁线程。

this.interval = this.createWorker(() => {

          //做要做的事

          this.txt++;

          if(this.txt == 30){

              this.stopWorker(this.interval)

              this.interval = null;

          }

        }, 1000)

       2、   visibilitychange - Web API 接口参考 | MDN

document.addEventListener("visibilitychange", this.checkViChange);    

document.removeEventListener("visibilitychange", this.checkViChange);

checkViChange(){

      if (document.hidden) { // 隐藏

        this.cacheHiddenTime = moment().unix();

        if(this.setInterval){

          clearInterval(this.setInterval);

          this.setInterval = null;

        };

      }else{

        let cur = moment().unix() - this.cacheHiddenTime;

        this.countdown = this.countdown>cur ? (this.countdown-cur) : 0;

        this.countDownUtil();

      }

    },

额外/*

     * 倒计时秒转换【工具】

     * @param {string|0} 秒seconds

     */

    momentUtil(seconds) {  

      let currentTime = moment.duration(seconds, 'seconds');

      let ms = moment({

        h: currentTime.hours(),

        m: currentTime.minutes(),

        s: currentTime.seconds()

      }).format('mm:ss');

      return {

        m: ms.includes("Invalid") ? "00" : ms.split(':')[0],

        s: ms.includes("Invalid") ? "00" : ms.split(':')[1]

      };  

    }

 注意事项:在页面hidden情况下,虽然定时器被浏览器机制暂缓了,但是再次打开定时随便会加快直到恢复定时间隔,而且定时器没被销毁。所以在应用被挂起,最好的方式将定期器清除,再次打开的时候重新创建。本人采用的是visibilitychange方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中实现定时器检查WIFI连接状态的大致思路如下: 1. 使用标准的C语言库函数实现定时器功能,例如使用sleep()函数实现延时功能。 2. 使用系统网络库函数实现WIFI连接状态的检查,例如使用socket()函数创建套接字,使用connect()函数尝试连接目标服务器,然后根据返回值判断连接状态。 3. 在程序中使用一个while循环,不断地调用定时器和WIFI状态检查函数,根据检查结果决定程序的后续操作。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define WIFI_CHECK_INTERVAL 10 // 检查WIFI连接状态的时间间隔(单位:秒) void wifi_check() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("WIFI Disconnected\n"); } else { struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(80); inet_pton(AF_INET, "192.168.1.1", &serv_addr.sin_addr); int res = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (res < 0) { printf("WIFI Disconnected\n"); } else { printf("WIFI Connected\n"); } close(sockfd); } } int main() { while (1) { wifi_check(); sleep(WIFI_CHECK_INTERVAL); } return 0; } ``` 这个程序每隔10秒检查一次WIFI连接状态,如果连接正常则输出"WIFI Connected",否则输出"WIFI Disconnected"。你可以根据你的具体需求修改定时器间隔和检查的目标服务器地址等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值