Die Ressourcen sind geladen. Beförderung...

Faden

ThreadObjekte können erstellt oder zurückgegeben werdenthreading.Thread(), threading.getThread(), threading.mainThread(), undthreading.currentThread().

Ein Blick

DiepeekMessage()Funktion wird verwendet, um eine Nachricht von einem Thread zu erhalten.

DiepeekMessage()Funktion gibt die Nachricht zurück, die vom Thread empfangen wurde, der mit dem aktuellen Thread-Objekt verknüpft ist.

Zeichenfolge, Zahl, bool, Objekt, Array, Nullwert und andere vom System unterstützte Typen

Ein BlickMessage() Sieh nach Nachricht (Timeout)

Der Parametertimeoutist die Timeout-Einstellung. Sie blockiert und wartet auf die Anzahl der Millisekunden, die vom Parameter festgelegt werden, und gibt Daten zurück. Wenn keine Daten vorliegen und die Timeout-Einstellung das Limit überschreitet, wird ein Nullwert zurückgegeben.timeoutist auf 0 oder dietimeoutWenn die Daten des Kanals nicht übergeben werden, wird der Prozess blockiert und wartet, bis Daten aus dem Kanal empfangen werden.timeoutist auf -1 gesetzt, bedeutet dies, dass der Prozess Daten nicht sofort blockiert und zurückgibt.

Zeitverzögerung falsche Zahl

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 postMessage():", i)
            threading.mainThread().postMessage(i)
            Sleep(500)
        }        
    })

    while (true) {
        var msg = threading.currentThread().peekMessage()
        Log("main peekMessage():", msg)
        if (msg == 9) {
            break
        }
        Sleep(1000)
    }

    t1.join()
}

Senden Sie Nachrichten an den Hauptthread von einem gleichzeitigen Thread.

Beim Schreiben von Programmen müssen wir auf Thread-Standstillstandsprobleme achten.

{@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/threads/Thread/name}, {@Threads/threads/eventLoop EventLoop}

Nachricht

DiepostMessage()Funktion wird verwendet, um eine Nachricht an einen Thread zu senden.

PostNachricht ((msg)

Der Parametermsgist die Botschaft, die gesendet wird.

Msg - Das stimmt. Jeder vom System unterstützte Typ, z. B. Zeichenfolge, Zahl, bool, Objekt, Array, Funktion, Nullwert usw.

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 postMessage():", i)
            threading.mainThread().postMessage(i)
            Sleep(500)
        }        
    })
    for (var i = 0; i < 10; i++) {
        var event = threading.mainThread().eventLoop()
        Log("main event:", event)
        Sleep(500)
    }
    t1.join()
}

Senden von Nachrichten in gleichzeitigen Threads und VerwendungeventLoop()um Benachrichtigungen über Nachrichten zu erhalten.

function main() {
    threading.mainThread().postMessage(function(msg) {
        Log("func from mainThread, msg:", msg)
    })
    
    threading.Thread(function() {
        var func = threading.mainThread().peekMessage()
        func("in " + threading.currentThread().name())
    }).join()
}

Es unterstützt das Senden einer Funktion.

Wenn die Ausführungsfunktion eines Threads diepostMessage()Wir können die Funktion verwenden, um ein Signal oder Daten zu senden, ein Nachrichtenereignis wird auch generiert.eventLoop()Funktion zum Empfangen von Nachrichtenbenachrichtigungen.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}

Eintritt

Diejoin()Funktion wird verwendet, um zu warten, bis der Thread aussteigt und die Systemressourcen zurückfordert.

DieThreadRetGegenstandenthält Daten über das Ausführungsergebnis. Zu den Eigenschaften gehören:

  • id: Thread-ID.
  • beendet: Ob der Faden zum Ende gezwungen wird.
  • Vergangenheit: Laufzeit des Faden in Nanosekunden.
  • Ret: Der Rückgabewert der Thread-Funktion.

ThreadRetGegenstand

Ich bin ein Teil von dir. Teilnahme (Timeout)

DietimeoutDie Zeitdauer in Millisekunden für das Warten auf das Ende des Threads wird verwendet.timeoutParameter auf 0 oder dietimeoutParameter nicht eingestellt ist,join()Funktion wird blockieren und warten, bis der Thread ausführt.timeoutDer Parameter ist auf -1,join()Die Funktion wird sofort wiederhergestellt.

Zeitverzögerung falsche Zahl

function main() {
    var t1 = threading.Thread(function() {
        Log("Hello thread1")
        Sleep(5000)
    })

    var ret = t1.join(1000)
    Log("ret:", ret)   // ret: undefined

    ret = t1.join()
    Log("ret:", ret)   // ret: {"id":1,"terminated":false,"elapsed":5003252000}
}

Test derjoin()Funktion für Timeout und Ausgabe des Rückgabewerts.

Diejoin()Funktionszeiten aus und zurückundefined.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

beenden

Dieterminate()Funktion wird verwendet, um einen Thread zwangsweise zu beenden und die Hardware-Ressourcen freizugeben, die vom erstellten Thread verwendet werden.

beenden

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 10; i++) {
            Log("thread1 i:", i)
            Sleep(1000)
        }
    })

    Sleep(3000)
    t1.terminate()
    Log("after t1.terminate()")

    while (true) {
        LogStatus(_D())
        Sleep(1000)
    }
}

Die Ausführung eines Threads wird gewaltsam beendet. Nach dem gewaltsamen Beenden eines Threads gibt es keinen Ausgang aus diesem Thread im Protokoll.

Für Fäden, die gewaltsam durch dieterminate()Wir können nicht mehr diejoin()Funktion, um zu warten, bis sie beendet werden.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}

GetDaten

DiegetData()Diese Funktion wird verwendet, um auf Variablen zuzugreifen, die in der Thread-Umgebung aufgezeichnet sind.join()Funktion (Wartend auf erfolgreichen Ausgang) und hat dieterminate()Funktion (Zwangsschließung des Gurtes).

DiegetData()Funktion gibt den Schlüsselwert zurückkeyParameter im Schlüssel-Wert-Paar, das im aktuellen Thread-Kontext gespeichert ist.

Zeichenfolge, Zahl, bool, Objekt, Array, Nullwert und andere vom System unterstützte Typen

GetDaten (siehe unten) GetData (Schlüssel)

DiekeyParameter ist der Schlüsselname des gespeicherten Schlüssel-Wert-Paares.

Schlüssel wahr String

function main() {
    var t1 = threading.Thread(function() {
        for (var i = 0; i < 5; i++) {
            threading.currentThread().setData("count", i)
            Log(`setData("count"):`, i)
            Sleep(1000)
        }
    })
    for (var i = 0; i < 5; i++) {
        var count = threading.getThread(t1.id()).getData("count")
        Log(`getData("count"):`, count)
        Sleep(1000)
    }
    t1.join()
}

Wert des Schlüssels erfassencountin der gleichzeitigen Thread-Umgebung, und dann lesen Sie den Schlüsselwert voncountin den Hauptgedanken.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/setData set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}

SetDaten

DiesetData()Funktion wird verwendet, um Variablen im Thread-Kontext zu speichern.

SetDaten (Schlüssel, Wert)

DiekeyParameter wird verwendet, um den Schlüsselnamen des gespeicherten Schlüssel-Wert-Paares anzugeben.

Schlüssel wahr String DievalueParameter wird verwendet, um den Schlüsselwert des gespeicherten Schlüssel-Wert-Paares anzugeben.

Wert - Das stimmt. Jeder vom System unterstützte Typ, z. B. Zeichenfolge, Zahl, bool, Objekt, Array, Funktion, Nullwert usw.

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Sleep(1000)
    Log(`t1.getData("data"):`, t1.getData("data"))
    t1.join()
}

Setzen Sie das Schlüssel-Wert-Paar im gleichzeitigen Thread und lesen Sie das Schlüssel-Wert-Paar im Hauptthread.

function main() {
    threading.mainThread().setData("func2", function(p) {
        Log("func2 p:", p)
    })
    
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("func1", function(p) {
            Log("func1 p:", p)
        })
    
        var func2 = threading.mainThread().getData("func2")
        func2("test2")
    })
    
    Sleep(1000)
    var func1 = t1.getData("func1")
    func1("test1")
    t1.join()
}

Es unterstützt die Übertragung von Schlüsselwerten auf Funktionen.

Die Daten sind gültig, wenn der Thread diejoin()Funktion (Wartend auf erfolgreichen Ausgang) und hat dieterminate()Funktion (Zwangsbeenden des Threads).valuemuss eine serialisierbare Variable sein.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}

Identifizierung

Dieid()Funktion wird verwendet, um diethreadIdder aktuellen multithreaded Objektinstanz.

Der Rücklaufwert derid()Funktion istthreadId.

Zahl

Die Daten sind hier:

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.id():`, t1.id())
    t1.join()
}

Erstellen Sie einen gleichzeitig laufenden Thread und geben Sie diethreadIdvon diesem gleichlaufenden Faden im Hauptfaden.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

Name

Diename()Funktion wird verwendet, um den Namen der aktuellen Multithreaded-Objektinstanz zurückzugeben.

Diename()Funktion gibt den gleichzeitigen Threadnamen zurück.

String

Name (n)

function main() {
    var t1 = threading.Thread(function() {
        threading.currentThread().setData("data", 100)
    })
    Log(`t1.name():`, t1.name())  // t1.name(): Thread-1
    t1.join()
}

Erstellen Sie einen gleichzeitigen Thread und geben Sie den Namen des gleichzeitigen Threads im Hauptthread aus.

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/eventLoop eventLoop}

EventLoop

DieeventLoop()Die Funktion wird verwendet, um die vom Thread empfangenen Ereignisse anzuhören.

DieeventLoop()Funktion gibt die vom aktuellen Thread empfangenen Ereignisinformationen zurück. SieheVeranstaltungsinformationsstruktur.

Objekt, Nullwert

EventLoop ((() EventLoop (Zeitrahmen)

Der Parametertimeoutist die Timeout-Einstellung in Millisekunden.timeoutist auf 0 gesetzt, wartet es, bis ein Ereignis stattfindet, bevor es zurückkehrt. Wenn es größer als 0 ist, setzt es das Ereignis auf Wartezeit. Wenn es kleiner als 0 ist, gibt es sofort das letzte Ereignis zurück.

Zeitverzögerung falsche Zahl

function main() {
    var t1 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop()     // Blocking wait
            // 2024-11-14 10:14:18 thread1 eventMsg: {"Seq":1,"Event":"thread","ThreadId":0,"Index":1,"Queue":0,"Nano":1731550458699947000}
            Log(_D(), "thread1 eventMsg:", eventMsg)
        }
    })

    var t2 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop(-1)   // Return immediately
            Log(_D(), "thread2 eventMsg:", eventMsg)
            Sleep(5000)
        }
    })

    var t3 = threading.Thread(function() {
        while (true) {
            var eventMsg = threading.currentThread().eventLoop(3000) // Set a 3 second timeout
            Log(_D(), "thread3 eventMsg:", eventMsg)
        }
    })

    t1.postMessage("Hello ", t1.name())
    t2.postMessage("Hello ", t2.name())
    t3.postMessage("Hello ", t3.name())
    t1.join()
    t2.join()
    t3.join()
}

Führen Sie drei Threads gleichzeitig aus und geben Sie die empfangenen Ereignisinformationen aus.

Der Verarbeitungsmechanismus dereventLoop()Funktion ist die gleiche wie die globale FunktionEventLoop().

{@fun/Threads/Thread/peekMessage peekMessage}, {@fun/Threads/Thread/postMessage postMessage}, {@fun/Threads/Thread/join join}, {@fun/Threads/Thread/terminate terminate}, {@fun/Threads/Thread/getData getData}, {@fun/Threads/Thread/setData setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}

Schleiffaden ThreadLock