static void WorkThread(TaskGraph taskGraph) { while (true) { taskGraph.mEventDispatch.Wait(); { if (taskGraph.mEventExit.Wait(0)) { break; } taskGraph.mEventReady.Signal(); taskGraph.mEventReady.Wait(); if (taskGraph.mTaskListHeads.Count > 0 && taskGraph.mTaskListDependence.Count > 0) { TaskEvent taskEvent = taskGraph.mEventRun; do { taskEvent.Wait(); while (true) { bool bFinish = false; TaskBase task = null; taskGraph.mMutex.WaitOne(); { if (taskGraph.mTaskListHeads.ContainsKey(taskEvent) && taskGraph.mTaskListHeads[taskEvent] != null) { task = taskGraph.mTaskListHeads[taskEvent]; taskGraph.mTaskListHeads[taskEvent] = taskGraph.mTaskListHeads[taskEvent].Next; } else { bFinish = true; } } taskGraph.mMutex.ReleaseMutex(); if (task != null) { task.TaskFunc(); task.SetEventSignal(); } if (bFinish) { break; } } taskEvent = taskGraph.mTaskListDependence.Count > 0 ? taskGraph.mTaskListDependence[taskEvent] : null; } while (taskEvent != null); } } taskGraph.mEventDispatch.Reset(); taskGraph.mEventFinish.Signal(); } }
public void Wait() { mEventFinish.Wait(); mTaskListHeads.Clear(); mTaskListDependence.Clear(); }