Esempio n. 1
0
    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();
        }
    }
Esempio n. 2
0
    public void Wait()
    {
        mEventFinish.Wait();

        mTaskListHeads.Clear();
        mTaskListDependence.Clear();
    }