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); } }
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); } }
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); } }
internal void Enqueue(KSPTSParametrizedTask newTask, KSPTSThreadingGroup group) { taskQueues[group].Enqueue(newTask); _hasTasks = true; }
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); }