การกำหนดการรหัสมีประโยชน์ในหลายสถานการณ์ เช่น การรับประกันว่ารหัสจะดำเนินการหลังจากที่การกระทำหรือรอบเฉพาะเสร็จสิ้น หรือการหน่วงเวลารหัสเป็นระยะเวลาที่เฉพาะเจาะจง คุณสามารถใช้ไลบรารี task เพื่อปรับแต่ง ตัวจัดการงาน ของ Roblox เพื่อจัดการและกำหนดการรหัสได้ นอกจากนี้คุณยังสามารถใช้ไลบรารีที่คล้ายกันเรียกว่า coroutine เพื่อกำหนดการรหัสซึ่งมีฟังก์ชันเสริมบางอย่าง
วิธีการทั่วไป
ต่อไปนี้คือวิธีการ task ที่พบได้บ่อยที่สุดซึ่งใช้ในการกำหนดการรหัส คุณควรใช้วิธีการงานแทนที่วิธีการกำหนดการแบบเดิม เช่น wait() เพื่อให้แน่ใจว่ารหัสของคุณทำงานได้อย่างมีประสิทธิภาพ
ตารางต่อไปนี้แสดงรายการวิธีการทั่วไปแบบเดิมที่เกี่ยวข้องและตัวเลือกที่ได้รับการปรับปรุงที่แนะนำ:
| วิธีการทั่วไปแบบเดิม | วิธีการงาน | ตัวเลือกเพิ่มเติม |
|---|---|---|
| wait() | task.wait() | RunService.Heartbeat |
| wait(n) | task.wait(n) | |
| spawn(f) | task.defer(f) | task.delay(0, f) |
| delay(n, f) | task.delay(n, f) | |
| spawn(function() f(uv1, ...) end) | task.defer(f, uv1, ...) | task.delay(0, f, uv1, ...) |
| delay(n, function() f(uv1, ...) end) | task.delay(n, f, uv1, ...) |
task.spawn()
task.spawn() รับเธรดหรือฟังก์ชันและดำเนินการต่อ ทันที ผ่านตัวจัดการของเอนจิน อาร์กิวเมนต์เพิ่มเติมจะถูกส่งไปยังเธรดหรือฟังก์ชันที่กำลังดำเนินการต่อ
ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นว่าคุณสามารถใช้ task.spawn() เมื่อเรียกฟังก์ชันที่อาจหยุดระหว่างการวนซ้ำผ่านชุดของวัตถุ:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() รับเธรดหรือฟังก์ชันและเลื่อนมันออกไปจนถึงจุดการคืนค่าปัจจุบันภายในเฟรมปัจจุบัน อาร์กิวเมนต์เพิ่มเติมจะถูกส่งไปยังเธรดหรือฟังก์ชันที่กำลังดำเนินการต่อ
คุณควรใช้วิธีนี้เมื่อคุณต้องการพฤติกรรมที่คล้ายกันกับ task.spawn() แต่ไม่สนใจว่าเธรดจะทำงานทันทีหรือล่าช้า ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นว่าคำสั่ง print() สำหรับ "A" จะเลื่อนไปจนกว่าคำสั่ง print() สำหรับ "B" จะดำเนินการ:
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() รับเธรดหรือฟังก์ชันและกำหนดการให้กลับมาดำเนินการหลังจากเวลาที่กำหนดผ่านไปในขั้นตอนถัดไปของ Heartbeat เธรดกลับมาดำเนินการพร้อมการจัดการข้อผิดพลาดในตัวและการสนับสนุนสำหรับฟีเจอร์อื่น ๆ ของเอนจิน อาร์กิวเมนต์เพิ่มเติมจะถูกส่งไปยังเธรดหรือฟังก์ชันที่กำลังดำเนินการต่อ
เนื่องจากเวลาที่ล่าช้าจริงอาจแตกต่างกันไป ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นว่าคุณสามารถคำนวณเวลานั้นได้โดยการส่งเวลาปัจจุบันเป็นอาร์กิวเมนต์:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
ระยะเวลาศูนย์จะส่งผลให้เธรดหรือฟังก์ชันกลับมาดำเนินการในขั้นตอนถัดไป
task.wait()
task.wait() ทำการหยุดเธรดปัจจุบันจนกว่าระยะเวลาที่กำหนด (เป็นวินาที) จะหมดไปและจากนั้นกลับมาดำเนินการเธรดในขั้นตอนถัดไปของ Heartbeat
เวลาที่หยุดจริงอาจแตกต่างกัน ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นว่าวิธีนี้ส่งค่ากลับเพื่อความสะดวก:
เนื่องจากเวลาที่ล่าช้าจริงอาจแตกต่างกันไป ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นว่าคุณสามารถรับเวลาได้จริงโดยการเก็บค่าที่คืนจากวิธีนี้:
local elapsedTime = task.wait(2) -- รอเป็นเวลา 2 วินาทีprint(elapsedTime) --> 2.0792941
หากไม่ได้กำหนดระยะเวลา ระยะเวลาจะถูกตั้งค่าเป็นศูนย์ ซึ่งหมายความว่าเธรดจะกลับมาดำเนินการในขั้นตอนถัดไปโดยอัตโนมัติ ซึ่งหมายความว่า task.wait() มีพฤติกรรมที่เหมือนกับ RunService.Heartbeat