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

    文章

    78

    浏览量

    18098
  • 循环
    +关注

    关注

    0

    文章

    92

    浏览量

    15973
  • 代码
    +关注

    关注

    30

    文章

    4781

    浏览量

    68542
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

    如何让程序执行过程暂停

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

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

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

    数据引擎威廉希尔官方网站 的原理及其DCS的应用

    数据引擎威廉希尔官方网站 的原理及其DCS的应用 一、引言     &nbs
    发表于 03-05 15:32 1219次阅读

    虚幻引擎4使用多核最大化视觉效果

    3-2-1 GLORP!看看这个UE4展示CPU粒子的虚幻引擎演示。
    的头像 发表于 11-05 06:40 4648次阅读

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

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

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

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

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

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

    如何实现暂停GRAPH程序块?

    博图Graph 程序在运行过程,某些情况(报警,互锁等)下需要将Graph 程序暂停去解决问题,当问题解决后,需要接着当前的步继续执行Graph 程序。而OFF_SQ 这个引脚是让Graph 程序停止运行,不能继续往下走,这时就需要使用HALT_SQ
    的头像 发表于 05-22 09:41 2217次阅读
    如何<b class='flag-5'>实现</b><b class='flag-5'>暂停</b>GRAPH程序块?

    波束成形AI引擎上的实现

    电子发烧友网站提供《波束成形AI引擎上的实现.pdf》资料免费下载
    发表于 09-13 14:37 0次下载
    波束成形<b class='flag-5'>在</b>AI<b class='flag-5'>引擎</b>上的<b class='flag-5'>实现</b>