-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtask_manager.gd
executable file
·71 lines (54 loc) · 1.7 KB
/
task_manager.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
extends Node
class Task:
var id : int
var joined : bool = false
signal completed
func _init(id: int):
self.id = id
func get_processed_element_count() -> int:
return 1 if is_completed() else 0
func is_completed() -> bool:
if joined:
return true
return WorkerThreadPool.is_task_completed(self.id)
func wait() -> void:
joined = true
WorkerThreadPool.wait_for_task_completion(self.id)
class GroupTask:
extends Task
func get_processed_element_count() -> int:
return WorkerThreadPool.get_group_processed_element_count(self.id)
func is_completed() -> bool:
if joined:
return true
return WorkerThreadPool.is_group_task_completed(self.id)
func wait() -> void:
joined = true
WorkerThreadPool.wait_for_group_task_completion(self.id)
var tasks := []
var mutex := Mutex.new()
func create_task(action: Callable, high_priority := false, description := "") -> Task:
var task_id := WorkerThreadPool.add_task(action, high_priority, description)
var task := Task.new(task_id)
mutex.lock()
tasks.append(task)
mutex.unlock()
return task
func create_group_task(action: Callable, elements : int, tasks_needed := -1, high_priority := false, description := "") -> GroupTask:
var group_task_id : int = WorkerThreadPool.add_group_task(action, elements, tasks_needed, high_priority, description)
var group_task := GroupTask.new(group_task_id)
mutex.lock()
tasks.append(group_task)
mutex.unlock()
return group_task
func _process(_delta: float) -> void:
mutex.lock()
var completed_tasks := tasks.filter(
func completed(task: Task):
return task.is_completed()
)
for completed_task in completed_tasks:
var task : Task = completed_task
task.completed.emit()
tasks.erase(task)
mutex.unlock()