【教程】Autojs脚本实现暂停和超时重启功能的思路和示例代码

news2024/11/14 21:57:08

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

背景介绍

        autojs本身不支持暂停脚本,现有网上大部分最直接的做法就是在每条语句后面添加检查是否暂停。当脚本功能和代码量非常打的时候,每一条语句后面都加检测,未免不太现实。

        这里我自己想到了一个极其方便的方法,但可能控制粒度会稍微大一点点,不过其实不影响的。效果示例:

暂停/启动功能

        一般来说,代码都是模块化的,也就是以函数为单位。并且脚本是按照轮询来写的,以面对突发的意外界面。因此,大致框架为:

functiion main() {
  func1()
  sleep(xx);

  func1()
  sleep(xx);

  func1()
  sleep(xx);

  // ...

  funcN()
  sleep(xx);
}


function func1() {
  while(true) {
    // do something: xxxxx;
    mysleep(1);
    if(xxx) {break;}
    // ...
    sleep(1);
  }
}

function func2() {
  // same as func1
}

// ...

function funcN() {
  // same as func1
}

        那么,实际上,我们可以改造sleep函数,间接实现暂停功能。改造如:

/**延时函数,可以实现伪暂停、超时重置等功能 */
var prev_pause_flag = null;
var pause_run = false;

function mysleep(t) {
  if(prev_pause_flag==null || prev_pause_flag!=pause_run) {
    prev_pause_flag = pause_run;
    log(pause_run?"被暂停了...":"正在运行中...");
  }
  while(pause_run) {
    sleep(500);
  }
  sleep(t);
}

        这样,通过把脚本中所有的sleep改为mysleep,并且在需要的时候设置标志位pause_run,就可以实现脚本的暂停和启动了。用法与sleep一模一样,直接平替。

        效果如图:

超时重启功能

        事实上,通过略微改动,还可以实现脚本超时重启功能。一般超时检测是通过看门狗watch dog的机制。原理就是通过定时喂狗来保持运行,当一定时间内没有喂狗,就判定是超时,就可以重启了。

        实现思路是,脚本一般不会在一个地方一直循环很久,如果是的话那很有可能就是卡住了。那么,只需要在调用mysleep时候,额外再判断一下当前执行的是什么功能,如果一定时间(或次数)内都是这个功能,那就判定为超时。参考实现如下:

/**延时函数,可以实现伪暂停、超时重置等功能 */
var prev_pause_flag = null;
var pause_run = false;
var prev_e_type = null;
var e_type_cntout = 0;
// 最大超时次数
var e_type_cntmax= 60; 

function mysleep(t, e_type) {
  if(prev_pause_flag==null || prev_pause_flag!=pause_run) {
    prev_pause_flag  =pause_run;
    debug(pause_run?"被暂停了...":"正在运行中...");
  }
  while(pause_run) {
    sleep(500);
  }

  sleep(t);

  if(prev_e_type==null || prev_e_type!=e_type) {
    e_type_cntout  = 0;
    prev_e_type  = e_type;
  }
  e_type_cntout += 1;
  if(e_type_cntout > e_type_cntmax) {
    e_type_cntout = 0;
    debug("超时了");
  }
}

        其中,e_type随便填,字符串也行。使用实例:

functiion main() {
  func1()
  sleep(1);

  func1()
  sleep(1);

  func1()
  sleep(1);

  // ...

  funcN()
  sleep(1);
}


function func1() {
  while(true) {
    // do something: xxxxx;
    mysleep(1);
    if(xxx) {break;}
    // ...
    mysleep(1, "func1");
  }
}

function func2() {
  // same as func1
}

// ...

function funcN() {
  // same as func1
}

        那么,当func1中函数执行太久后,就会触发超时警告了。不过要注意e_type的使用时机!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot】Starter的使用与案例讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《SpringBoot》。🎯🎯 &…

Linux主机自动注册NPS客户端(脚本化)

参考官方对API使用方法的定义:https://ehang-io.github.io/nps/#/ 1、首先必须要在配置文件中开启 auth_key 并配置一个合适的密钥 2、修改脚本中的可变量参数,以适配自己的环境 #!/bin/bash # 脚本使用说明:# 脚本名称:npc_cr…

I Doc View在线文档预览系统cms.json存在RCE漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 i Doc View是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。 漏洞概述 iDocView是一个在线文档I Doc View在线文档预览系统cmd.json 处存在命令执行漏洞,攻击者可通过此漏洞获…

【产品经理】需求池和版本树

在这个人人都是产品经理的时代,每位入行的产品人进阶速度与到达高度各有不同。本文作者结合自身三年产品行业的经历,根据案例拆解产品行业的极简研发过程、需求池、版本树、产品自我优化等相关具体方法论。 一、产品研发的极简过程 1. 产品概述 产品就…

第二证券:股票买卖五档什么意思?

股票生意五档是股票生意中的一个常见术语。它是指股票生意盘中最上面的五个报价。股票生意盘是股票商场上的生意报价汇总,其间卖盘代表了其时商场中卖方的报价,买盘代表了其时商场中买方的报价。 股票生意五档通常是指股票生意盘中最上面的五个报价&…

AR眼镜光学方案_AR眼镜整机硬件定制

增强现实(Augmented Reality,AR)技术通过将计算机生成的虚拟物体或其他信息叠加到真实世界中,实现对现实的增强。AR眼镜作为实现AR技术的重要设备,具备虚实结合、实时交互的特点。为了实现透视效果,AR眼镜需要同时显示真实的外部世…

差分法详解

前言 差分算法适用于一些需要对数组和序列进行增减、查询和更新操作的问题,可以提高计算效率和降低存储空间的需求。今天我将带大家学习如何使用差分法,会以例题来带大家使用差分法以增进理解。话不多说让我们开始吧! 文章目录 一维差分尾声…

3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?

除了读取轻松外,HOOPS Communicator对超大模型的支持效果也非常好,它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型! 那么它是如何来实现对大模型的支持呢? 我们将从以下几个方面与大家分享:最低帧率…

算法的时间复杂度是什么?

算法的时间复杂度是什么? 时间复杂度的概念 时间复杂度是用来估算出程序的运行时间的。我们通常会估计算法的操作单元数量,来代表程序消耗的时间。 随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近…

线性回归在数据库中的应用

简介 今天看到微信群有人问,如何知道数据库一年的磁盘增量?如果没有研究过统计学,IT人员对于这个问题就只能靠经验了去断定了。没经验的往往都是回复扩容越大越好。当然未来的事情我们是无法预料的。本博主就通过简单的线性回归做一个计算&am…

12. IO

1.File类 • File 类代表与平台无关的文件和目录。 • File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。 1).File的常用方法 在这里插入图片描述 2).遍历给定目录所有文件 …

QT-坦克大战游戏

QT-坦克大战游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "score.h" Score::Score(){health30; maxHealthhealth;QLabel *label1 new QLabel(this);label1->setFrameStyle(QFrame::Plain | QFrame::Box);label1->setStyle…

SpringCloud面试题——Sentinel

一:什么是Sentinel? Sentinel是一个面向分布式架构的轻量级服务保护框架,实现服务降级、服务熔断、服务限流等功能 二:什么是服务降级? 比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备…

干货|你必须要知道的机器视觉常识!

Part.1 机器视觉是什么 机器视觉是一种能够模拟人类视觉系统的技术,是计算机的“慧眼”,能够使计算机理解和解释图像或视频中的信息。 机器视觉包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术…

设计模式-状态(State)模式

目录 开发过程中的一些场景 状态模式的简单介绍 状态模式UML类图 类图讲解 适用场景 Java中的例子 案例讲解 什么是状态机 如何实现状态机 SpringBoot状态自动机 优点 缺点 与其他模式的区别 小结 开发过程中的一些场景 我们在平时的开发过程中,经常会…

C++ Qt开发:ProgressBar进度条组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ProgressBar进度条组件的常用方法及灵活运用。…

SpringBoot配置mysql加密之Druid方式

一、导入Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>二、生成密文 方式1. 找到存放druid jar包的目录 1-1、在目录…

EasyExcel处理表头的缓存设置

在学习EasyExcel 时会发现针对使用类模型配置表头相关属性时&#xff0c;EasyExcel 会使用到缓存技术以提升表头的解析速度如下代码&#xff1a; 这些参数再何时设置的哪&#xff1f; 在easyExcel 基础参数设置中会有这个参数filedCacheLocation 。默认采用的使用线程级别的…

MVVM前端设计模式的发展与应用

在MVC模式中&#xff0c;随着代码量越来越大&#xff0c;Controller主要用来处理各种逻辑和数据转化的Controller首当其冲&#xff0c;变得非常庞大&#xff0c;MVC的简写变成了Massive-View-Controller&#xff08;意为沉重的Controller&#xff09; 我曾经接手老项目&#x…

什么是rocketmq❓

在大规模分布式系统中&#xff0c;各个服务之间的通信是至关重要的&#xff0c;而RocketMQ作为一款分布式消息中间件&#xff0c;为解决这一问题提供了强大的解决方案。本文将深入探讨RocketMQ的基本概念、用途&#xff0c;以及在实际分布式系统中的作用&#xff0c;并对Produc…