En la carga de los recursos... Cargando...

El hilo

Threadobjetos pueden ser creados o devueltos porthreading.Thread(), threading.getThread(), threading.mainThread(), ythreading.currentThread().

PeekMensaje

ElpeekMessage()La función se utiliza para obtener un mensaje de un hilo.

ElpeekMessage()función devuelve el mensaje recibido por el hilo asociado con el objeto de hilo actual.

cadena, número, bool, objeto, matriz, valor nulo y otros tipos compatibles con el sistema

PeekMensaje (() PeekMessage ((tiempo muerto)

El parámetrotimeoutes la configuración de tiempo de espera. Bloqueará y esperará el número de milisegundos establecidos por el parámetro y devolverá los datos. Si no hay datos y el tiempo de espera excede el límite, se devolverá un valor nulo. Sitimeoutse establece en 0 o eltimeoutsi el parámetro no se pasa, significa que el proceso bloqueará y esperará hasta que se reciban los datos del canal.timeoutSi se establece en -1, significa que el proceso no bloqueará y devolverá datos de inmediato.

tiempo de espera falsos Número

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

Envía mensajes al hilo principal desde un hilo concurrente.

Al escribir programas, necesitamos prestar atención a los problemas de cierre de hilo.

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

Envío de mensaje

ElpostMessage()función se utiliza para enviar un mensaje a un hilo.

El mensaje es:

El parámetromsges el mensaje que se enviará.

mensaje de texto verdadero Cualquier tipo compatible con el sistema, como cadena, número, bool, objeto, matriz, función, valor nulo, 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()
}

Enviar mensajes en hilos simultáneos y usareventLoop()para recibir notificaciones de mensajes.

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

Apoya el envío de una función.

Cuando una función de ejecución de thread llama a lapostMessage()La función para enviar una señal o datos, un evento de mensaje también se genera.eventLoop()Función para recibir notificaciones de mensajes.

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

¿ Qué pasa?

Eljoin()Función utilizada para esperar a que el hilo salga y reclame recursos del sistema.

ElThreadRetobjetoscontiene datos sobre el resultado de la ejecución.

  • Identificación del hilo.
  • terminado: Si el hilo se ve obligado a terminar.
  • transcurrido: tiempo de funcionamiento del hilo en nanosegundos.
  • ret: el valor de retorno de la función de hilo.

ThreadRetobjetos

¿Qué quieres decir? Unirse (tiempo muerto)

EltimeoutParámetro se utiliza para establecer el tiempo de espera en milisegundos para esperar a que el hilo para terminar.timeoutel parámetro se establece en 0 o eltimeoutel parámetro no está establecido, eljoin()función bloqueará y esperar hasta que el hilo termine de ejecutar.timeoutel parámetro está establecido en -1, eljoin()La función volverá inmediatamente.

tiempo de espera falsos Número

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

Prueba eljoin()Función de tiempo de espera y salida del valor de retorno.

Eljoin()Tiempos de salida y retorno de la funciónundefined.

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

terminado

Elterminate()La función se utiliza para terminar por la fuerza un hilo y liberar los recursos de hardware utilizados por el hilo creado.

Terminar el contrato

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

Terminar la ejecución de un hilo con la fuerza Después de terminar un hilo con la fuerza, no habrá salida de este hilo en el registro.

Para los hilos que se terminan por la fuerza por elterminate()La función, ya no podemos utilizar eljoin()Función para esperar a que terminen.

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

Obtener Datos

ElgetData()Los datos son válidos cuando el hilo no ha ejecutado eljoin()Función (en espera de exit exit) y no ha ejecutado elterminate()Función (terminando el hilo por la fuerza).

ElgetData()Función devuelve el valor clave correspondiente a lakeyParámetro en el par clave-valor almacenado en el contexto del hilo actual.

cadena, número, bool, objeto, matriz, valor nulo y otros tipos compatibles con el sistema

- ¿Qué quieres decir? - ¿ Qué pasa?

ElkeyParámetro es el nombre de la clave del par clave-valor almacenado.

llave verdadero la cuerda

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

Registre el valor de la clavecounten el entorno de hilo concurrente, y luego leer el valor clave decounten el hilo 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 name}, {@fun/Threads/Thread/eventLoop eventLoop}

el conjunto de datos

ElsetData()La función se utiliza para almacenar variables en el contexto del hilo.

el conjunto de datos (clave, valor)

ElkeyEl parámetro se utiliza para especificar el nombre de la clave del par clave-valor almacenado.

llave verdadero la cuerda ElvalueEl parámetro se utiliza para especificar el valor de clave del par clave-valor almacenado.

Valor verdadero Cualquier tipo compatible con el sistema, como cadena, número, bool, objeto, matriz, función, valor nulo, etc.

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

Establezca el par clave-valor en el hilo concurrente y lea el par clave-valor en el hilo 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()
}

Apoya la transmisión de valores clave a funciones.

Los datos son válidos cuando el hilo no ha ejecutado eljoin()Función (en espera de exit exit) y no ha ejecutado elterminate()El valor del parámetrovaluedebe ser una variable serializable.

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

el número de

Elid()función se utiliza para devolver elthreadIdde la instancia actual de objeto multithreaded.

El valor de retorno de laid()la función esthreadId.

Número

el número de identificación

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

Crear un hilo de ejecución simultánea y la salida de lathreadIdde este hilo concurrente en el hilo 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}

nombre

Elname()función se utiliza para devolver el nombre de la instancia de objeto multithreaded actual.

Elname()función devuelve el nombre del hilo concurrente.

la cuerda

nombre ())

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

Crea un hilo concurrente y saca el nombre del hilo concurrente en el hilo 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/eventLoop eventLoop}

Loop de evento

EleventLoop()La función se utiliza para escuchar los eventos recibidos por el hilo.

EleventLoop()función devuelve la información del evento recibido por el hilo actual.Estructura de la información del evento.

Objeto, valor cero

Loop de acontecimientos EventLoop (tiempo muerto)

El parámetrotimeoutes la configuración de tiempo de espera en milisegundos.timeoutSi el valor de un evento es igual a 0, esperará a que ocurra un evento antes de regresar. Si es mayor que 0, establecerá el tiempo de espera del evento. Si es menor que 0, devolverá el evento más reciente inmediatamente.

tiempo de espera falsos Número

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

Ejecute tres hilos simultáneamente y saque la información del evento recibida.

El mecanismo de procesamiento de loseventLoop()la función es la misma que la función globalEventLoop().

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

el hilo Enlace de hilo