0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Rhino引擎中实现暂停效果

汽车电子技术 来源:安卓脚本 作者: 稻草人 2023-03-03 10:21 次阅读

好吧在文章开始之前, 我想纠正一个名称上的说法, Autojs的用户目前来看分为三大类:

还在使用开源版的用户, 免费 版本号截止到4.1.1之前

使用Pro8.0版本的用户, 该版本不包含node引擎,只有Rhino引擎

使用Pro9.0版本的用户, 该版本包含Node和Rhino两个引擎

免费版我们就称为免费版, Pro8.0版本,直接说8.0版本或者pro8,同理9.0一样9.0版本或者pro9, 现在对于8.0和9.0的autojs存在很多叫法, 这种叫法非常容易和别的概念混淆,什么V8. V9 V8引擎, 一代引擎, 二代引擎,各种奇葩叫法, 请放弃这些花里胡哨的说法, 直接回归最基本的名称好吧,方便大家沟通, 另外一代 二代的叫法只是对于文档来说的.

8.0版本中只有rhino引擎,它使用的是JavaScript ES5标准,另外有少许的ES6特性,使用时,阅读官网的一代文档, 8.0不包含NodeJS引擎,也就是说,Nodejs的代码无法在8.0版本中运行;

9.0版本中包含8.0版本的Rhino引擎,使用方法和8.0一样,开发文档使用一代文档(注意不要称为一代引擎), 另外从9.0版本开始加入了Node引擎,可以使用nodejs来开发项目,node引擎使用的是二代文档, Node引擎和Rhino引擎都可以在pro9.x版本以上使用.

因此,如果你使用的是Pro9.x版本,遇到问题, 请像这样描述: "我使用的是Pro9, 代码开发使用的是rhino引擎, 在运行时遇到下列错误...", "我使用的是9.0版本,使用的是Node引擎开发环境, 运行代码时发生这样的错误..."


正文开始: (不好意思忍不住吐槽了一下.)

昨天,又遇到来问,JS代码中怎么暂停/继续代码的执行,之前一直不想做这个功能, 因为JS本身在运行时,就不支持暂停,如果非要做暂停的话. 我能给出的方案,只有使用死循环来暂停运行, 其大概原理, 循环判断某个属性的值是否符合预期,如果符合,就暂停运行, 不符合了就跳出循环,继续执行下方的代码, 并且呢,这个死循环,要加到代码的每一行中.

呵~这种做法,TMD听起来就有点离谱.既然非得要,那必然得牺牲点什么罢...

那么,干货来了, 下面的代码是封装好的一个模块:

module.exports = ( function() {


    let MianThread;


    let IsRun = false;
    let IsPause = false;
    //就是在要运行的代码中逐行插入这句代码...
    let PauseFun = "while( true ){ if ( !IsPause ) { break; } sleep( 10 ); }";

    this.SetRunState = function( state ) {
        IsRun = state;
    }
    this.GetRunState = function() {
        return IsRun;
    }
    this.SetPauseState = function( state ) {
        IsPause = state;
    }
    this.GetPauseState = function () {
        return IsPause;
    }
    /**
     * 保证功能不会被重复运行.
     * @param {*} main 要执行的功能函数
     * @returns void
     */
    this.RunScript = ( main ) => {
        try {
            if ( this.GetRunState() ) {
                toastLog( "该功能正在运行,无法重复运行" );
                return;
            }
            let mainStr = main.toString();
            let mainStrArry = mainStr.split( "\\n" );
            let mainFunStr = "";
            for ( let i in mainStrArry ) {
                if ( mainStrArry[ i ] == "" ) continue;
                if ( i <= mainStrArry.length - 3 ) {
                    mainFunStr += mainStrArry[ i ] + "\\n" + PauseFun + "\\n";
                }
            }
            mainFunStr += "}";
            main = eval( mainFunStr );
            // log(main.toString());
            this.SetRunState( true );
            MianThread = threads.start( main );
        } catch ( e ) {
            toastLog( "[ CATCH_INFO ]: " + e );
            this.SetRunState( false );
            return;
        }
        //等待运行脚本的线程执行完成,改变状态
        threads.start( () => {
            if ( MianThread ) {
                MianThread.join();
                this.SetRunState( false );
            }
        } );
    }
    this.Stop = function() {
        if ( this.GetRunState() ) {
            MianThread.interrupt();
        }
    }

    this.Pause = function() {
        if ( !this.GetPauseState() ) {
            this.SetPauseState( true );
            console.log("当前逻辑已暂停!");
        } else {
            console.log( "继续执行代码逻辑" );
            this.SetPauseState( false );
        }
    }


    return this;
} )()

模块中封装了几个方法, 通过两个属性的bool值去控制 传入方法的运行状态. 在使用runScript( main ); 方法时, 对于传入的main函数,进行重新封装,逐行插入死循环代码...然后再运行这个函数. 在线程外通过Pause()方法去控制暂停和继续.然后写一个简单的demo.

"ui";


$ui.layout( 
    "*" gravity="center|center_horizontal|center_vertical">
        "center|center_horizontal|center_vertical" margin="20" cardCornerRadius="8dp" cardElevation="5dp" >
            "20 10" gravity="center|center_horizontal|center_vertical">
                
                    "16sp">运行结果: class="hljs-name"text>
                    "runResult" inputType="text" singleLine="true" gravity="center"  w="*" h="60" textSize="18sp" />
                class="hljs-name"linear>
                "center" >
                    
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JS
    JS
    +关注

    关注

    0

    文章

    73

    浏览量

    17848
  • 循环
    +关注

    关注

    0

    文章

    91

    浏览量

    15855
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
收藏 人收藏

    评论

    相关推荐

    基于Notes的OA工作流引擎的设计和实现

    Lotus Domino/Notes平台下实现的工作流,具有代码少、易开发、易实现和安全性高等特点。以此工作流为基础,开发网上协作系统,会达到投入少和收效高的效果。工作流技术的使用
    发表于 04-24 09:22

    labview数据采集暂停文件写入pausel

    用labview采集数据,并记录到某个文件,按下暂停按钮后,怎么文件写入pausel以表示曾经暂停过,哪位高人指点一下,在此先谢过了。
    发表于 02-21 15:40

    怎么labview实现靠边自动隐藏效果??

    labview实现靠边自动隐藏效果,就是类似于QQ界面靠近电脑的屏幕的边上就是自动隐藏这样子的一个功能,谢谢了。。。
    发表于 11-02 21:43

    怎样实现定时器的暂停

    怎样实现定时器的暂停和重启啊
    发表于 02-13 22:33

    stm8 c语言如何实现暂停功能?

    使用按键来实现如下功能。按1下,start,再按一下暂停,再按一下continue,请问功能如何实现? 主任务是 数码管逐个点亮。
    发表于 04-15 13:09

    请问labview程序如何添加暂停按键?

    labview程序如何添加“暂停”按键!实现和工具栏暂停”按键一样的功能。功能要求:程序开始运行后按“
    发表于 08-08 17:32

    Rhino+工具套件能实现什么功能?

    Rhino+。爱特梅尔的AT88SA102S器件是业界最安全的认证IC,使用嵌入式SHA-256 引擎和256位加密密钥,几乎无法使用任何暴力方法击破,而竞争对手最接近的认证IC之密钥容量仅为128位
    发表于 08-16 06:21

    LED调光引擎方案

    通道,这是大多数现成LED驱动器控制器所不具备的一项独特能力。图1,LED调光引擎可由单片机中提供的外设构成。这些引擎均具有独立的封闭通道,极少需要甚至不需要中央处理单元(CPU)
    发表于 09-20 09:05

    FPGA赛车引擎控制单元有什么用处?

    基于MCU、定制ASIC和体积庞大的电线束来实现引擎及控制电子的系统方案已发展至接近其技术和应用极限,汽车工业正面临新的设计挑战,本文介绍FPGA赛车引擎控制单元
    发表于 10-17 08:34

    实现暂停程序,再次运行后还能恢复暂停前状态

    labview如何实现点击暂停暂停程序,再点击运行键的时候程序恢复到暂停前的状态,设置的实验次数也能从暂停时继续完成剩下的次数?有大神能帮
    发表于 11-02 11:11

    如何让程序执行过程暂停

    你如何让程序执行过程暂停,就像Arduino 的 通过 Basic 的 delay 函数: delay: 会等待一定的毫秒数再继续
    发表于 05-10 07:22

    基于Rhino3D开发平台的鞋楦二、三维相互相转换的设与实现

    本文介绍了一种基于Rhino3D 开发平台的鞋楦二、三维之间相互转换的设计,该设计使得鞋楦二维到三维和三维到二维的转换得到统一实现。并且满足转换前后,二维鞋样和三维鞋样的
    发表于 09-14 14:43 0次下载

    Rhino软件教程之Rhino6.0如何精确的移动物件

    今天给大家分享一个关系犀牛(Rhino6.0)的小知识。希望对大家有所帮助和提升。
    的头像 发表于 11-17 10:02 2.2w次阅读

    PLC控制伺服 如何实现暂停功能?

    plc控制伺服,如何实现暂停功能,基本可以从硬件和软件的方面去实现伺服电机的暂停功能。硬件方面就是断开伺服驱动器的电源,在这里一般都有一个常闭的信号接到驱动器电源的接触器上,一旦发生故
    的头像 发表于 07-02 15:43 1.5w次阅读
    PLC控制伺服 如何<b class='flag-5'>实现</b><b class='flag-5'>暂停</b>功能?

    如何找回Rhino犀牛的指令框、左边栏

    如果觉得以上步骤比较麻烦的情况下,也可以直接【Rhino选项】页面点击下方的【还原预设值】,即可将软件界面的所有设置都还原成最初的设置,这样Rhino犀牛的指令框、左边栏也会重新恢复显示,并正常的使用。
    的头像 发表于 10-23 17:34 2.8w次阅读
    如何找回<b class='flag-5'>Rhino</b>犀牛的指令框、左边栏