Sumber daya yang dimuat... Pemuatan...

Benang

Threadobjek dapat dibuat atau dikembalikan olehthreading.Thread(), threading.getThread(), threading.mainThread(), danthreading.currentThread().

PeekMessage

PeraturanpeekMessage()fungsi digunakan untuk mendapatkan pesan dari thread.

PeraturanpeekMessage()fungsi mengembalikan pesan yang diterima oleh thread yang terkait dengan objek thread saat ini.

string, number, bool, object, array, null value dan jenis lain yang didukung oleh sistem

PeekMessage (() peekMessage (timeout)

Parametertimeoutadalah pengaturan timeout. Ini akan memblokir dan menunggu jumlah milidetik yang ditetapkan oleh parameter dan mengembalikan data. Jika tidak ada data dan timeout melebihi batas, nilai nol akan dikembalikan. Jikatimeoutditetapkan menjadi 0 atautimeoutparameter tidak dilewati, itu berarti bahwa proses akan memblokir dan menunggu sampai data diterima dari saluran.timeoutJika nilai yang ditetapkan adalah -1, berarti bahwa proses tidak akan memblokir dan mengembalikan data segera.

timeout palsu Nomor

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

Kirim pesan ke thread utama dari thread paralel.

Saat menulis program, kita perlu memperhatikan 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}

PostMessage

PeraturanpostMessage()fungsi digunakan untuk mengirim pesan ke thread.

postMessage ((msg)

Parametermsgadalah pesan yang akan dikirim.

msg benar Setiap jenis yang didukung oleh sistem, seperti string, angka, bool, objek, array, fungsi, nilai nol, 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()
}

Kirim pesan dalam thread bersamaan dan gunakaneventLoop()untuk menerima pemberitahuan pesan.

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

Ini mendukung mengirim fungsi.

Ketika fungsi eksekusi threads memanggilpostMessage()fungsi untuk mengirim sinyal atau data, sebuah peristiwa pesan juga dihasilkan.eventLoop()fungsi untuk menerima pemberitahuan pesan.

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

bergabung

Peraturanjoin()fungsi digunakan untuk menunggu thread untuk keluar dan merebut kembali sumber daya sistem.

PeraturanThreadRetobjekberisi data tentang hasil pelaksanaan.

  • id: ID benang.
  • diakhiri: Apakah benang dipaksa untuk berakhir.
  • elapsed: Waktu berjalan benang dalam nanodetik.
  • ret: Nilai yang dikembalikan dari fungsi thread.

ThreadRetobjek

Bergabunglah. bergabung (timeout)

Peraturantimeoutparameter digunakan untuk mengatur timeout dalam milidetik untuk menunggu thread untuk selesai.timeoutparameter diatur ke 0 atautimeoutparameter tidak diatur,join()fungsi akan memblokir dan menunggu sampai thread selesai menjalankan.timeoutParameter diatur menjadi -1,join()Fungsi akan segera kembali.

timeout palsu Nomor

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

Ujilahjoin()fungsi untuk timeout dan output nilai kembali.

Peraturanjoin()fungsi waktu 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 mengakhiri thread dan melepaskan sumber daya perangkat keras yang digunakan oleh thread yang dibuat.

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

Mengakhiri eksekusi thread secara paksa Setelah mengakhiri thread secara paksa, tidak akan ada output dari thread ini di log.

Untuk benang yang diakhiri dengan paksa olehterminate()fungsi, kita tidak bisa lagi menggunakanjoin()fungsi untuk menunggu mereka untuk mengakhiri.

{@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 variabel yang tercatat dalam lingkungan thread. data yang valid ketika thread belum menjalankanjoin()fungsi (menunggu keberhasilan keluar) dan belum melaksanakanterminate()fungsi (mengakhiri benang secara paksa).

PeraturangetData()fungsi mengembalikan nilai kunci yang sesuai dengankeyparameter dalam pasangan nilai kunci yang disimpan dalam konteks thread saat ini.

string, number, bool, object, array, null value dan jenis lain yang didukung oleh sistem

getData ((() getData (kunci)

Peraturankeyparameter adalah nama kunci dari pasangan kunci-nilai yang disimpan.

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

Catat nilai kuncicountdalam lingkungan thread bersamaan, dan kemudian membaca nilai kunci daricountdi 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 variabel dalam konteks thread.

setData ((kunci, nilai)

PeraturankeyParameter digunakan untuk menentukan nama kunci dari pasangan kunci-nilai yang disimpan.

kunci benar string PeraturanvalueParameter digunakan untuk menentukan nilai kunci dari pasangan kunci-nilai yang disimpan.

nilai benar Setiap jenis yang didukung oleh sistem, seperti string, angka, bool, objek, array, fungsi, nilai nol, dll.

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

Atur pasangan kunci-nilai di thread paralel dan baca pasangan kunci-nilai di thread 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()
}

Ini mendukung key-value passing ke dalam fungsi.

Data yang valid ketika thread belum dijalankanjoin()fungsi (menunggu keberhasilan keluar) dan belum melaksanakanterminate()fungsi (mengakhiri thread secara paksa). Nilai parametervalueharus menjadi variabel yang dapat 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 name}, {@fun/Threads/Thread/eventLoop eventLoop}

id

Peraturanid()fungsi digunakan untuk mengembalikanthreadIddari instansi objek multithreaded saat ini.

Nilai pengembalianid()fungsi adalahthreadId.

nomor

id()

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

Buat thread yang berjalan bersamaan dan outputthreadIddari thread paralel ini di 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/name name}, {@fun/Threads/Threads/Thread/eventLoop eventLoop}

nama

Peraturanname()fungsi digunakan untuk mengembalikan nama contoh objek multithreaded saat ini.

Peraturanname()fungsi mengembalikan nama thread bersamaan.

string

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 paralel dan keluarkan nama thread paralel di 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 mendengarkan untuk acara yang diterima oleh thread.

PeraturaneventLoop()fungsi mengembalikan informasi peristiwa yang diterima oleh thread saat ini. LihatStruktur Informasi Acara.

objek, nilai nol

eventLoop (() eventLoop (timeout)

Parametertimeoutadalah pengaturan timeout dalam milidetik Jika parametertimeoutjika set menjadi 0, akan menunggu suatu peristiwa terjadi sebelum kembali. jika lebih besar dari 0, akan mengatur event waiting timeout. jika kurang dari 0, akan mengembalikan event terbaru segera.

timeout palsu Nomor

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

Mengeksekusi tiga thread secara bersamaan dan keluarkan informasi peristiwa yang diterima.

Mekanisme pemrosesaneventLoop()fungsi 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}

Pembuatan thread ThreadLock