Sumber dimuat naik... memuat...

Benang

Threadobjek boleh dicipta atau dikembalikan olehthreading.Thread(), threading.getThread(), threading.mainThread(), danthreading.currentThread().

PeekMessage

PeraturanpeekMessage()fungsi digunakan untuk mendapatkan mesej dari utas.

PeraturanpeekMessage()fungsi mengembalikan mesej yang diterima oleh utas yang dikaitkan dengan objek utas semasa.

rentetan, nombor, bool, objek, susunan, nilai sifar dan jenis lain yang disokong oleh sistem

PeekMessage() peekMessage ((timeout)

Parametertimeoutadalah tetapan masa lapang. Ia akan menyekat dan menunggu bilangan milidetik yang ditetapkan oleh parameter dan mengembalikan data. Jika tidak ada data dan masa lapang melebihi had, nilai sifar akan dikembalikan. Jikatimeoutditetapkan kepada 0 atautimeoutparameter tidak lulus, ia bermakna bahawa proses akan menyekat dan menunggu sehingga data diterima dari saluran.timeoutJika set kepada -1, ia bermaksud bahawa proses tidak akan menyekat dan mengembalikan data dengan segera. Jika tidak ada data, nilai null akan dikembalikan.

masa lapang palsu nombor

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

Hantar mesej ke thread utama dari thread serentak.

Apabila menulis program, kita perlu memberi perhatian kepada masalah thread deadlock.

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

postMesej

PeraturanpostMessage()fungsi digunakan untuk menghantar mesej ke utas.

postMessage ((msg)

Parametermsgadalah mesej yang akan dihantar.

msg betul Mana-mana jenis yang disokong oleh sistem, seperti rentetan, nombor, bool, objek, array, fungsi, nilai sifar, dll.

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

Hantar mesej dalam utas serentak dan gunakaneventLoop()untuk menerima pemberitahuan mesej.

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

Ia menyokong menghantar fungsi.

Apabila fungsi pelaksanaan thread memanggilpostMessage()fungsi untuk menghantar isyarat atau data, peristiwa mesej juga dihasilkan.eventLoop()fungsi untuk menerima pemberitahuan mesej.

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

menyertai

Peraturanjoin()fungsi digunakan untuk menunggu untuk utas untuk keluar dan mendapatkan semula sumber sistem.

PeraturanThreadRetobjekmengandungi data mengenai hasil pelaksanaan.

  • id: ID benang.
  • Ditamatkan: Sama ada benang dipaksa untuk berakhir.
  • telah berlalu: Masa berjalan benang dalam nanodetik.
  • ret: Nilai pulangan fungsi benang.

ThreadRetobjek

menyertai ((() join ((timeout)

Peraturantimeoutparameter digunakan untuk menetapkan masa lapang dalam mili saat untuk menunggu untuk benang untuk selesai.timeoutparameter ditetapkan kepada 0 atautimeoutparameter tidak ditetapkan,join()fungsi akan menyekat dan menunggu sehingga benang selesai menjalankan.timeoutparameter ditetapkan kepada -1,join()Fungsi akan kembali dengan segera.

masa lapang palsu nombor

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

Ujijoin()fungsi untuk masa lapang dan output nilai pulangan.

Peraturanjoin()fungsi masa keluar dan kembaliundefined.

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

mengakhiri

Peraturanterminate()fungsi digunakan untuk memaksa menamatkan thread dan melepaskan sumber perkakasan yang digunakan oleh thread yang dicipta.

mengakhiri ((()

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

Menamatkan pelaksanaan thread dengan paksa. Selepas memaksa menamatkan thread, tidak akan ada output dari thread ini dalam log.

Untuk benang yang diakhiri secara paksa olehterminate()fungsi, kita tidak boleh lagi menggunakanjoin()fungsi untuk menunggu mereka untuk menamatkan.

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

getData

PeraturangetData()fungsi digunakan untuk mengakses pembolehubah yang direkodkan dalam persekitaran benang. data adalah sah apabila benang belum menjalankanjoin()fungsi (menunggu kejayaan keluar) dan tidak menjalankanterminate()fungsi (mengakhiri benang secara paksa).

PeraturangetData()fungsi mengembalikan nilai kunci yang sepadan dengankeyparameter dalam pasangan kunci-nilai yang disimpan dalam konteks thread semasa.

rentetan, nombor, bool, objek, susunan, nilai sifar dan jenis lain yang disokong oleh sistem

getData() getData (kunci)

Peraturankeyparameter adalah nama kunci pasangan kunci-nilai yang disimpan.

kunci betul senar

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

Mencatatkan nilai kuncicountdalam persekitaran benang serentak, dan kemudian membaca nilai kuncicountdalam benang utama.

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

setData

PeraturansetData()fungsi digunakan untuk menyimpan pembolehubah dalam konteks benang.

setData ((kunci, nilai)

Peraturankeyparameter digunakan untuk menentukan nama kunci pasangan kunci-nilai yang disimpan.

kunci betul senar Peraturanvalueparameter digunakan untuk menentukan nilai kunci pasangan kunci-nilai yang disimpan.

nilai betul Mana-mana jenis yang disokong oleh sistem, seperti rentetan, nombor, bool, objek, array, fungsi, nilai sifar, dll.

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

Tetapkan pasangan kunci-nilai di benang serentak dan baca pasangan kunci-nilai di benang utama.

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

Ia menyokong nilai kunci yang lulus ke fungsi.

Data adalah sah apabila benang belum dilaksanakanjoin()fungsi (menunggu kejayaan keluar) dan tidak menjalankanterminate()fungsi (mengakhiri benang secara paksa). Nilai parametervaluemestilah pembolehubah yang boleh diserialisasikan.

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

id

Peraturanid()fungsi digunakan untuk mengembalikanthreadIddari contoh objek multithread semasa.

Nilai pulanganid()fungsi ialahthreadId.

nombor

id()

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

Membuat benang yang berjalan serentak dan outputthreadIddaripada benang serentak ini dalam benang utama.

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

nama

Peraturanname()fungsi digunakan untuk mengembalikan nama contoh objek multithread semasa.

Peraturanname()fungsi mengembalikan nama benang bersamaan.

senar

nama (()

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

Buat thread serentak dan keluarkan nama thread serentak dalam thread utama.

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

PeraturaneventLoop()fungsi digunakan untuk mendengar untuk peristiwa yang diterima oleh benang.

PeraturaneventLoop()fungsi mengembalikan maklumat peristiwa yang diterima oleh thread semasa. LihatStruktur Maklumat Acara.

objek, nilai sifar

eventLoop (dalam bahasa Inggeris) eventLoop (timeout)

Parametertimeoutadalah tetapan masa lapang dalam milidetik. Jika parametertimeoutJika ia lebih besar daripada 0, ia akan menetapkan masa tunggu acara. Jika ia kurang daripada 0, ia akan mengembalikan acara terbaru dengan serta-merta.

masa lapang palsu nombor

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

Melakukan tiga benang serentak dan mengeluarkan maklumat peristiwa yang diterima. Jika masa tamat berlaku atau fungsi kembali dengan segera, nilai output adalah sifar.

Mekanisme pemprosesaneventLoop()fungsi adalah sama dengan fungsi 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 setData}, {@fun/Threads/Thread/id id}, {@fun/Threads/Thread/name name}

Penggelek ThreadLock