Les ressources ont été chargées... Je charge...

Le fil

ThreadLes objets peuvent être créés ou retournés parthreading.Thread(), threading.getThread(), threading.mainThread(), etthreading.currentThread().

Un coup d'œilMessage

LepeekMessage()la fonction est utilisée pour obtenir un message d'un thread.

LepeekMessage()fonction renvoie le message reçu par le thread associé à l'objet de thread en cours.

chaîne, nombre, bool, objet, tableau, valeur nulle et autres types pris en charge par le système

Je suis en train de lire un article. Je suis en train d'essayer d'arrêter.

Le paramètretimeoutest le paramètre de temps d'arrêt. Il bloque et attend le nombre de millisecondes défini par le paramètre et renvoie les données. S'il n'y a pas de données et que le temps d'arrêt dépasse la limite, une valeur nulle est renvoyée. Sitimeoutest réglé sur 0 ou letimeoutsi le paramètre n'est pas passé, cela signifie que le processus va bloquer et attendre jusqu'à ce que les données soient reçues du canal.timeoutSi la valeur est réglée sur -1, cela signifie que le processus ne bloquera pas et ne renverra pas les données immédiatement.

temps d'arrêt faux Numéro

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()
}

Envoyer des messages au fil principal à partir d'un fil concurrent.

Lorsque nous écrivons des programmes, nous devons prêter attention aux problèmes d'impasse des threads.

{@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/Threads/Thread/name name}, {@Threads/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}

PostMessage

LepostMessage()fonction est utilisée pour envoyer un message à un thread.

PostMessage (message)

Le paramètremsgest le message à envoyer.

Message à envoyer vrai Tout type pris en charge par le système, tel que chaîne, nombre, bool, objet, tableau, fonction, valeur nulle, etc.

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()
}

Envoyer des messages dans des threads simultanés et utilisereventLoop()pour recevoir des notifications de messages.

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()
}

Il prend en charge l'envoi d'une fonction.

Lorsque la fonction d'exécution d'un thread appelle lepostMessage()Nous pouvons utiliser la fonction pour envoyer un signal ou des données, un événement de message est également généré.eventLoop()fonction de réception des notifications de messages.

{@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/Threads/Thread/name name}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Threads/eventLoop eventLoop}

rejoindre

Lejoin()fonction est utilisée pour attendre que le thread sorte et récupère les ressources du système.

LeThreadRetobjetcontient des données sur le résultat de l'exécution.

  • id: Id du fil.
  • terminé: si le fil est forcé de se terminer.
  • dépassé: temps de fonctionnement du fil en nanosecondes.
  • ret: la valeur renvoyée par la fonction thread.

ThreadRetobjet

rejoignez rejoindre ((timeout)

LetimeoutLe paramètre est utilisé pour définir le temps d'arrêt en millisecondes pour attendre la fin du fil.timeoutparamètre est réglé sur 0 ou letimeoutparamètre n'est pas réglé, lejoin()fonction va bloquer et attendre jusqu'à ce que le fil termine l'exécution.timeoutle paramètre est réglé sur -1,join()La fonction va revenir immédiatement.

temps d'arrêt faux Numéro

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}
}

Testez lejoin()fonction pour le temps d'arrêt et la sortie de la valeur de retour.

Lejoin()temps de sortie et de retour de la fonctionundefined.

{@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/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

terminer

Leterminate()fonction est utilisée pour mettre fin de force à un thread et libérer les ressources matérielles utilisées par le thread créé.

terminé

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)
    }
}

Terminer l'exécution d'un thread par la force. Après avoir terminé un thread par la force, il n'y aura pas de sortie de ce thread dans le journal.

Pour les fils qui sont terminés de force par leterminate()Nous ne pouvons plus utiliser lejoin()fonction d'attendre qu'ils se terminent.

{@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/Threads/Thread/name name}, {@fun/Threads/Threads/eventLoop Loop}

Pour obtenir les données

LegetData()Les données sont valables lorsque le thread n'a pas exécuté lejoin()fonction (en attente de sortie réussie) et n'a pas exécuté leterminate()fonction (termination du fil par la force).

LegetData()La fonction renvoie la valeur de clé correspondant à la valeur dekeyparamètre dans la paire clé-valeur stockée dans le contexte du thread en cours.

chaîne, nombre, bool, objet, tableau, valeur nulle et autres types pris en charge par le système

- Je ne sais pas. Je suis en train d' écrire.

Lekeyparamètre est le nom de la clé de la paire clé-valeur stockée.

clé vrai chaîne

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()
}

Enregistrer la valeur de la clécountdans l'environnement de fil en parallèle, puis lire la valeur clé decountdans le fil principal.

{@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}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/Thread/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/Threads/eventLoop eventLoop}, {@fun/

Réglage des données

LesetData()la fonction est utilisée pour stocker des variables dans le contexte du thread.

définitionDétails (clé, valeur)

Lekeyparamètre est utilisé pour spécifier le nom de clé de la paire clé-valeur stockée.

clé vrai chaîne Levalueparamètre est utilisé pour spécifier la valeur de clé de la paire clé-valeur stockée.

valeur vrai Tout type pris en charge par le système, tel que chaîne, nombre, bool, objet, tableau, fonction, valeur nulle, etc.

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

Définissez la paire clé-valeur dans le thread concurrent et lisez la paire clé-valeur dans le thread principal.

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()
}

Il prend en charge le passage de la valeur de la clé dans les fonctions.

Les données sont valables lorsque le thread n'a pas exécuté lejoin()fonction (en attente de sortie réussie) et n'a pas exécuté leterminate()La valeur du paramètrevaluedoit être une variable sérialisable.

{@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/Threads/eventLoop eventLoop}

Nom de l'entreprise

Leid()fonction est utilisée pour retourner lethreadIdde l'instance d'objet multithread actuelle.

La valeur de rendement de laid()la fonction estthreadId.

Numéro

Nom de l'entreprise

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

Créez un fil en cours d'exécution simultanée et sortez lethreadIdde ce fil parallèle dans le fil principal.

{@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 set}, {@fun/Threads/Thread/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

Nom

Lename()fonction est utilisée pour renvoyer le nom de l'instance d'objet multithreaded en cours.

Lename()la fonction renvoie le nom du fil concurrent.

une chaîne

Nom (s)

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

Créez un fil de discussion concurrent et sortez le nom du fil de discussion concurrent dans le fil principal.

{@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 set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/thread/eventLoop eventLoop}

événementLoop

LeeventLoop()la fonction est utilisée pour écouter les événements reçus par le thread.

LeeventLoop()fonction renvoie les informations d'événement reçues par le fil courant.Structure de l'information sur les événements.

objet, valeur nulle

événementLoop() événement Loop (délai de réponse)

Le paramètretimeoutest le temps d'arrêt en millisecondes.timeouts'il est défini sur 0, il attend qu'un événement se produise avant de retourner. s'il est supérieur à 0, il définit le temps d'attente de l'événement. s'il est inférieur à 0, il renvoie immédiatement le dernier événement.

temps d'arrêt faux Numéro

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()
}

Exécuter trois threads simultanément et produire les informations d'événement reçues.

Le mécanisme de traitement deseventLoop()est la même que la fonction globaleEventLoop().

{@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 set}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}, {@fun/Threads/Thread/name name},

filtrage Fermeture de fil