Thread
các đối tượng có thể được tạo hoặc trả về bởithreading.Thread()
, threading.getThread()
, threading.mainThread()
, vàthreading.currentThread()
.
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ốtimeout
là 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ặctimeout
tham 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}
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ốmsg
là 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 threadpostMessage()
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}
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.
ThreadRet
đối tượng
tham gia tham gia ((timeout)
Cáctimeout
tham 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.timeout
tham số được thiết lập thành 0 hoặctimeout
tham 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.timeout
tham 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}
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}
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ớikey
tham 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áckey
tham 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óacount
trong môi trường thread đồng thời, và sau đó đọc giá trị khóa củacount
trong 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}
CácsetData()
function được sử dụng để lưu trữ các biến trong ngữ cảnh thread.
setData ((key, giá trị)
Cáckey
tham 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ácvalue
tham 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ốvalue
phả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}
Cácid()
hàm được sử dụng để trả vềthreadId
củ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 rathreadId
củ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}
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}
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ốtimeout
là 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