示例#1
0
        private void DoTasks()
        {
            while (true)
            {
                KSPTSParametrizedTask currentTask = null;

                lock (locker)
                {
                    while (!_tasks.hasTasks())
                    {
                        Monitor.Wait(locker);
                    }

                    currentTask = _tasks.Dequeue();
                }

                if (currentTask.action == null)
                {
                    KSPTSThreadController.instance.EnqueuePostFunction(null, null, currentTask.threadingGroup);
                    continue;
                }

                object postFuncParam = currentTask.action(currentTask.parameter);

                KSPTSThreadController.instance.EnqueuePostFunction(currentTask.postFunction, postFuncParam, currentTask.threadingGroup);
            }
        }
示例#2
0
 internal void EnqueueNewTask(Func<object, object> newTask, object newParameter, Action<object> newPostFunction, KSPTSThreadingGroup group)
 {
     KSPTSParametrizedTask _paraAction = new KSPTSParametrizedTask(newTask, newParameter, newPostFunction, group);
     lock(locker)
     {
         _tasks.Enqueue(_paraAction, group);
         Monitor.Pulse(locker);
     }
 }
示例#3
0
        internal void EnqueueNewTask(Func <object, object> newTask, object newParameter, Action <object> newPostFunction, KSPTSThreadingGroup group)
        {
            KSPTSParametrizedTask _paraAction = new KSPTSParametrizedTask(newTask, newParameter, newPostFunction, group);

            lock (locker)
            {
                _tasks.Enqueue(_paraAction, group);
                Monitor.Pulse(locker);
            }
        }
示例#4
0
 internal void Enqueue(KSPTSParametrizedTask newTask, KSPTSThreadingGroup group)
 {
     taskQueues[group].Enqueue(newTask);
     _hasTasks = true;
 }
示例#5
0
        internal KSPTSParametrizedTask Dequeue()
        {
            Queue <KSPTSParametrizedTask> tmpQueue  = null;
            KSPTSParametrizedTask         returnVal = null;

            if (urgent)  //The main unity thread is waiting on something, clear everything out
            {
                tmpQueue = taskQueues[urgentQueue];
                if (tmpQueue.Count > 0)
                {
                    returnVal = tmpQueue.Dequeue();
                    _hasTasks = privateTaskCheck();
                    return(returnVal);
                }
                else
                {
                    urgent = false;
                }
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.IN_LOOP_FIXED_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.ACROSS_LOOP_FIXED_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.IN_LOOP_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.IN_LOOP_LATE_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.ACROSS_LOOP_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            tmpQueue = taskQueues[KSPTSThreadingGroup.ACROSS_LOOP_LATE_UPDATE];
            if (tmpQueue.Count > 0)
            {
                returnVal = tmpQueue.Dequeue();
                _hasTasks = privateTaskCheck();
                return(returnVal);
            }

            return(null);
        }
示例#6
0
 internal void Enqueue(KSPTSParametrizedTask newTask, KSPTSThreadingGroup group)
 {
     taskQueues[group].Enqueue(newTask);
     _hasTasks = true;
 }