Tài nguyên đang được tải lên... tải...

Sợi

Threadcác đối tượng có thể được tạo hoặc trả về bởithreading.Thread(), threading.getThread(), threading.mainThread(), vàthreading.currentThread().

peekMessage

CácpeekMessage()hàm được sử dụng để nhận một thông điệp từ một chủ đề.

CácpeekMessage()hàm trả về thông điệp được nhận bởi chủ đề liên kết với đối tượng chủ đề hiện tại.

chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống

peekMessage() peekMessage ((timeout)

Các thông sốtimeoutlà thiết lập thời gian hết. Nó sẽ chặn và chờ số milliseconds được thiết lập bởi tham số và trả về dữ liệu. Nếu không có dữ liệu và thời gian hết vượt quá giới hạn, giá trị null sẽ được trả về. Nếutimeoutđược thiết lập thành 0 hoặctimeouttham số không được thông qua, nó có nghĩa là quá trình sẽ chặn và chờ đợi cho đến khi dữ liệu được nhận từ kênh.timeoutđược đặt thành -1, điều đó có nghĩa là quá trình sẽ không chặn và trả về dữ liệu ngay lập tức. Nếu không có dữ liệu, giá trị null sẽ được trả về.

thời gian nghỉ sai số

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

Gửi tin nhắn đến chủ đề chính từ một chủ đề đồng thời.

Khi viết chương trình, chúng ta cần chú ý đến các vấn đề bế tắc.

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

CácpostMessage()hàm được sử dụng để gửi một thông điệp đến một chủ đề.

postMessage ((msg)

Các thông sốmsglà thông điệp được gửi đi.

msg đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.

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

Gửi tin nhắn trong các chủ đề đồng thời và sử dụngeventLoop()để nhận thông báo tin nhắn.

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

Nó hỗ trợ gửi một hàm.

Khi một hàm thực thi threads gọipostMessage()chức năng để gửi một tín hiệu hoặc dữ liệu, một sự kiện tin nhắn cũng được tạo ra.eventLoop()chức năng để nhận thông báo tin nhắn.

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

tham gia

Cácjoin()chức năng được sử dụng để chờ cho các luồng để thoát và lấy lại các tài nguyên hệ thống.

CácThreadRetđối tượngchứa dữ liệu về kết quả thực hiện.

  • id: Thread ID.
  • kết thúc: Có phải sợi được buộc phải kết thúc hay không.
  • đã trôi qua: Thời gian chạy của sợi trong nano giây.
  • ret: Giá trị trả về của hàm thread.

ThreadRetđối tượng

tham gia tham gia ((timeout)

Cáctimeouttham số được sử dụng để thiết lập thời gianout trong milliseconds cho chờ đợi cho các thread để kết thúc.timeouttham số được thiết lập thành 0 hoặctimeouttham số không được thiết lập,join()chức năng sẽ chặn và chờ cho đến khi các chủ đề hoàn thành thực thi.timeouttham số được thiết lập thành -1,join()chức năng sẽ trở lại ngay lập tức.

thời gian nghỉ sai số

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

Kiểm trajoin()chức năng cho thời gian nghỉ và đầu ra giá trị trả về.

Cácjoin()hàm thời gian ra và trở lạiundefined.

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

kết thúc

Cácterminate()chức năng được sử dụng để kết thúc một thread và giải phóng các tài nguyên phần cứng được sử dụng bởi thread được tạo.

kết thúc ((()

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

Kết thúc thực thi một chủ đề bằng vũ lực Sau khi kết thúc một chủ đề bằng vũ lực, sẽ không có đầu ra từ chủ đề này trong nhật ký.

Đối với các sợi được kết thúc bằng vũ lực bởi cácterminate()chức năng, chúng ta không thể sử dụngjoin()chức năng để chờ đợi chúng chấm dứt.

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

CácgetData()Dữ liệu là hợp lệ khi thread chưa thực thi cácjoin()chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()chức năng (kết thúc sợi dây bằng vũ lực).

CácgetData()hàm trả về giá trị khóa tương ứng vớikeytham số trong cặp giá trị khóa được lưu trữ trong ngữ cảnh luồng hiện tại.

chuỗi, số, bool, đối tượng, mảng, giá trị null và các loại khác được hỗ trợ bởi hệ thống

getData() getData ((key)

Cáckeytham số là tên khóa của cặp giá trị khóa được lưu trữ.

chìa khóa đúng chuỗi

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

Ghi lại giá trị của khóacounttrong môi trường thread đồng thời, và sau đó đọc giá trị khóa củacounttrong chủ đề.

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

setData

CácsetData()function được sử dụng để lưu trữ các biến trong ngữ cảnh thread.

setData ((key, giá trị)

Cáckeytham số được sử dụng để chỉ định tên khóa của cặp giá trị khóa được lưu trữ.

chìa khóa đúng chuỗi Cácvaluetham số được sử dụng để xác định giá trị khóa của cặp giá trị khóa được lưu trữ.

giá trị đúng Bất kỳ loại nào được hệ thống hỗ trợ, chẳng hạn như chuỗi, số, bool, đối tượng, mảng, hàm, giá trị không, v.v.

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

Đặt cặp key-value trong thread đồng thời và đọc cặp key-value trong thread chính.

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

Nó hỗ trợ chuyển giá trị khóa sang các hàm.

Dữ liệu là hợp lệ khi chủ đề chưa thực hiệnjoin()chức năng (đang chờ để thoát thành công) và đã không thực hiện cácterminate()Các giá trị của tham sốvaluephải là một biến có thể được nối tiếp.

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

Cácid()hàm được sử dụng để trả vềthreadIdcủa các trường hợp đối tượng đa luồng hiện tại.

Giá trị trả lại củaid()chức năng làthreadId.

số

id()

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

Tạo một chủ đề chạy đồng thời và đầu rathreadIdcủa chuỗi đồng thời này trong chuỗi chính.

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

tên

Cácname()function được sử dụng để trả lại tên của các trường hợp đối tượng đa luồng hiện tại.

Cácname()hàm trả về tên chủ đề đồng thời.

chuỗi

tên

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

Tạo một chủ đề đồng thời và xuất ra tên của chủ đề đồng thời trong chủ đề chính.

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

eventLoop

CáceventLoop()chức năng được sử dụng để nghe các sự kiện được nhận bởi các chủ đề.

CáceventLoop()hàm trả về thông tin sự kiện nhận được bởi các chủ đề hiện tại. XemCấu trúc thông tin sự kiện.

đối tượng, giá trị không

eventLoop (() eventLoop (thời gian hết)

Các thông sốtimeoutlà thiết lập timeout trong milliseconds. Nếu tham sốtimeoutđược thiết lập là 0, nó sẽ chờ cho một sự kiện xảy ra trước khi trả về. Nếu lớn hơn 0, nó sẽ thiết lập thời gian chờ sự kiện. Nếu nhỏ hơn 0, nó sẽ trả về sự kiện mới nhất ngay lập tức.

thời gian nghỉ sai số

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

Chạy ba chủ đề đồng thời và xuất thông tin sự kiện nhận được. Nếu thời gian hết hoặc hàm trả về ngay lập tức, giá trị đầu ra là không.

Cơ chế xử lýeventLoop()chức năng là giống như chức năng toàn cầuEventLoop().

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

sợi ThreadLock