Auto.js-Studiennotizen 18: Sub-Threads und Timer zusammen verwenden (Beispiel am Ende)

Inhaltsverzeichnis

Einführung in Threads

threads.start(action): Starten Sie einen neuen Thread und führen Sie die Aktion aus.

threads.shutDownAll()

threads.currentThread()

threads.disposable()

threads.lock(): Erstellen Sie eine neue Wiedereintrittssperre

Faden

Thread.interrupt(): Thread-Ausführung unterbrechen

Thread.join([timeout]): Warten Sie, bis die Thread-Ausführung abgeschlossen ist

isAlive(): ob der Thread aktiv ist

waitFor(): Warten Sie, bis der Thread mit der Ausführung beginnt

Thread.setTimeout(Rückruf, Verzögerung[, ...Argumente])

Thread.setInterval(Rückruf, Verzögerung[, ...Argumente])

Thread.clearInterval(id): Schließt den SetInterval-Sub-Thread-Timer

Thread.clearTimeout(id): Schließt den SetTimeout-Sub-Thread-Timer

Praktische Bedienung: Vollständiger Code zum Umschalten des Sub-Thread-Echtzeit-Timers

Zusammenfassen


Regierungstext:Auto.js Pro Docs

Einführung in Threads

Das Threads-Modul bietet Multithreading-Unterstützung und kann neue Threads starten, um Skripte auszuführen.

Der Hauptthread des Skripts wartet auf den Abschluss aller Unterthreads, bevor er die Ausführung stoppt. Wenn sich im Unterthread eine Endlosschleife befindet, rufen Sie daher bitte exit() auf Stoppen Sie das Skript direkt oder < /span>threads.shutDownAll(), um alle untergeordneten Threads zu stoppen.

Alle überthreads.start() gestarteten Threads werden automatisch gestoppt, wenn das Skript zum Stoppen gezwungen wird.

Da JavaScript selbst keine Multithreading-Unterstützung bietet, können unerwartete Probleme auftreten.

threads.start(action): Starten Sie einen neuen Thread und führen Sie die Aktion aus.

threads.start(function(){
    //在新线程执行的代码
    while(true){
        log("子线程");
    }
});
while(true){
    log("脚本主线程");
}

threads.shutDownAll()

Stoppen Sie alle über threads.start() gestarteten untergeordneten Threads.

threads.currentThread()

Gibt den aktuellen Thread zurück.

threads.disposable()

  • ​ Rückgabe {Einweg}

Erstellen Sie ein neues „Disposable“-Objekt, um auf ein einmaliges Ergebnis von einem anderen Thread zu warten. Weitere Informationen finden Sie unter Thread-Kommunikation und Einwegartikel.​

threads.lock(): Erstellen Sie eine neue Wiedereintrittssperre

Faden

Thread-Objektthreads.start()Das zurückgegebene Objekt wird verwendet, um den Status des Threads abzurufen und zu steuern, mit anderen Threads zu interagieren usw.

Das Thread-Objekt stellt dieselbe API wie das Timer-Modul bereit, z. B. setTimeout()setInterval() usw., die zum Ausführen entsprechender Timing-Rückrufe verwendet werden im Thread, wodurch eine direkte Interaktion zwischen Threads ermöglicht wird.

var thread = threads.start(function(){
    //在子线程执行的定时器
    setInterval(function(){
        log("子线程:" + threads.currentThread());
    }, 1000);
});

log("当前线程为主线程:" + threads.currentThread());

//等待子线程启动
thread.waitFor();
//在子线程执行的定时器
thread.setTimeout(function(){
    //这段代码会在子线程执行
    log("当前线程为子线程:" + threads.currentThread());
}, 2000);

sleep(30 * 1000);
thread.interrupt();

Thread.interrupt(): Thread-Ausführung unterbrechen

Thread.join([timeout]): Warten Sie, bis die Thread-Ausführung abgeschlossen ist

Wenn das Timeout 0 ist, wird gewartet, bis der Thread abgeschlossen ist. Andernfalls wird bis zum Timeout in Millisekunden gewartet.

var sum = 0;
//启动子线程计算1加到10000
var thread = threads.start(function(){
    for(var i = 0; i < 10000; i++){
        sum += i;
    }
});
//等待该线程完成
thread.join();
toast("sum = " + sum);

isAlive(): ob der Thread aktiv ist

Gibt zurück, ob der Thread aktiv ist. Wenn der Thread nicht gestartet oder beendet wurde, geben Sie false zurück; wenn der Thread gestartet ist oder läuft, geben Sie true zurück.

waitFor(): Warten Sie, bis der Thread mit der Ausführung beginnt

Nach dem Aufrufthreads.start() benötigt der Thread noch einige Zeit, um mit der Ausführung zu beginnen. Daher wartet der Aufruf dieser Funktion darauf, dass der Thread mit der Ausführung beginnt. Wenn sich der Thread bereits im Ausführungsstatus befindet, es kommt sofort zurück.

var thread = threads.start(function(){
    //do something
});
thread.waitFor();
thread.setTimeout(function(){
    //do something
}, 1000);

Thread.setTimeout(Rückruf, Verzögerung[, ...Argumente])

Der Unterschied besteht darin, dass der Timer in diesem Thread ausgeführt wird. Wenn der aktuelle Thread nicht mit der Ausführung begonnen hat oder die Ausführung beendet hat, wirdIllegalStateException ausgelöst.

log("当前线程(主线程):" + threads.currentThread());

var thread = threads.start(function(){
    //设置一个空的定时来保持线程的运行状态
    setInterval(function(){}, 1000);
});

sleep(1000);
thread.setTimeout(function(){
    log("当前线程(子线程):" + threads.currentThread());
    exit();
}, 1000);

Thread.setInterval(Rückruf, Verzögerung[, ...Argumente])

Stellen Sie den Schleifenausführungstimer ein.

Der Unterschied besteht darin, dass der Timer in diesem Thread ausgeführt wird. Wenn der aktuelle Thread nicht mit der Ausführung begonnen hat oder die Ausführung beendet hat, wirdIllegalStateException ausgelöst.

Thread.clearInterval(id): Schließt den SetInterval-Sub-Thread-Timer

Thread.clearTimeout(id):Schließen Sie den setTimeout-Sub-Thread-Timer

Praktische Bedienung: Vollständiger Code zum Umschalten des Sub-Thread-Echtzeit-Timers

isEmpty, getSameDayCustomGetTime sind alle für sich gekapselte Funktionen

Zustand: true ist aktiviert, false ist deaktiviert

function mainTimerModular(state){
   var startSuccessState = false;
   if(state){
        mainTimerThread =  threads.start(function(){
            toast("主计时器线程模块开启成功");
            let time = wxAutoConfigObj.timingTime;
            let h = time.substring(0,time.lastIndexOf(":"));
            let m = time.substring(time.indexOf(":")+1);
            let setTime = myUtils.getSameDayCustomGetTime(h,m);
            //在新线程执行的代码
            mainIntervalId = setInterval(function(){
                var curTime = new Date().getTime() ;
                if((setTime+1000) > curTime && curTime >= setTime){
                    log("触发成功");
                    startSuccessState = true;
                }else if((setTime+3000) > curTime && curTime>setTime && !startSuccessState){
                    startSuccessState = true;//强行触发,该情况一般不会出现
                    toastLog("时间到了没触发");
                }else if(curTime>(setTime+3000)){//当前时间小于最迟的范围值
                    if(startSuccessState){  
                        startSuccessState = false;
                        log("复原启动状态");
                    }
                }
            }, 1000);
        }); 
   }else{
        //停止线程执行
        if(!myUtils.isEmpty(mainIntervalId)){
            clearInterval(mainIntervalId);
        }
        if(!myUtils.isEmpty(mainTimerThread)){
            mainTimerThread.interrupt();
            mainTimerThread = null;
        }
        toast("主计时器线程模块关闭!")
   }  
}

Zusammenfassen

Bei der Entwicklung kommen an vielen Stellen Sub-Threads und Timer zum Einsatz und erfordern mehr Übung.

Nur zuzusehen und zu tippen ist nutzlos
Nach dem Lesen müssen Sie es üben
Sie müssen den Code eingeben
Machen Sie unbedingt Versuch und Irrtum.
Das ist sinnvolles Lernen

Guess you like

Origin blog.csdn.net/piyangbo/article/details/125907351