示例#1
0
 protected internal ForEachOrderedTask(PipelineHelper <T> helper, Spliterator <S> spliterator, Sink <T> action) : base(null)
 {
     this.Helper      = helper;
     this.Spliterator = spliterator;
     this.TargetSize  = AbstractTask.SuggestTargetSize(spliterator.EstimateSize());
     // Size map to avoid concurrent re-sizes
     this.CompletionMap   = new ConcurrentDictionary <>(System.Math.Max(16, AbstractTask.LEAF_TARGET << 1));
     this.Action          = action;
     this.LeftPredecessor = null;
 }
        protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
        {
            // TODO : Add persistence for reading results
            Form f = Form.builder.AddQuestion("The question", "Well done for doing the exercices, how do you feel now ?")
                     .SetTitle("Feedback about your work")
                     .Build();

            preMenu.planning.AskForm(f);
            preMenu.planning.Save();
            cancelUse = false;
        }
 protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
 {
     Console.WriteLine(" {0,-50} | {1}", "Option", "Description\n");
     preMenu.availableChoices.ForEach(delegate(PreMenuChoice c)
     {
         string s     = $"{ c.GetName() }";
         int tabCount = s.Length / 4;
         Console.WriteLine(" {0,-50} | {1}", c.GetName(), c.GetDescription());
     });
     Console.WriteLine("///////////////////////////////////////////");
     cancelUse = false;
 }
示例#4
0
        protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
        {
            // TODO : Add persistence for reading results
            Form f = Form.builder.AddQuestion("Let's talk about your objectives", "Why do you want to have good results with this planning ?")
                     .AddQuestion("...and your capabilities", "Tell me why are you able to do this planning?")
                     .SetTitle("Motivation Boost Feedback")
                     .Build();

            preMenu.planning.AskForm(f);
            preMenu.planning.Save();
            cancelUse = false;
        }
 protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancel)
 {
     if (preMenu.planning.AskToTypeAbandonConfirmText(d))
     {
         preMenu.planning.Abandon();
     }
     else
     {
         cancel = true;
     }
     cancel = false;
 }
示例#6
0
 private AbstractTask ReadTask()
 {
     lock (_locked) {
         if (_taskList.Count == 0)
         {
             return(null);
         }
         AbstractTask task = _taskList[0];
         _taskList.RemoveAt(0);
         return(task);
     }
 }
示例#7
0
 protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
 {
     if (t != null)
     {
         t.IsFinished = true;
         cancelUse    = false;
     }
     else
     {
         Console.WriteLine("Error while using option: AbstractTask is null");
         cancelUse = true;
     }
 }
示例#8
0
        public override AbstractPreMenu AskWaitTaskMenu(ref AbstractDay d, AbstractTask t)
        {
            var choices = preMenu.availableChoices.FindAll(x => x.count > 0 && x.ShowWhenWaiting());

            if (choices.Count == 0)
            {
                Console.WriteLine("Skipping Wait task menu because no options available");
                return(preMenu);
            }

            int selectedChoice = -1;

            Console.WriteLine("\n//////////////Wait menu////////////////");
            Console.WriteLine("This menu allows you to choose some options while waiting for the task to start");
            int curIndex = 1;

            foreach (var choice in choices)
            {
                if (choice.IsSelectable(out string msg))
                {
                    Console.WriteLine(curIndex + ")\t" + choice.GetName() + $" {choice.count}/{choice.maxCount}");
                }
                else
                {
                    Console.WriteLine("[Locked]\t" + choice.GetName());
                    Console.WriteLine("\t|\t" + msg);
                }
                curIndex++;
            }
            int quitChoice = curIndex;

            Console.WriteLine(quitChoice + ")\tClose the menu and wait/continue ");
            selectedChoice = SecureIntInput(1, curIndex, "Choose your option while waiting for the task : " + t.Infos.name);
            if (selectedChoice != quitChoice)
            {
                Console.WriteLine("Using choice ...");
                var choice = choices[selectedChoice - 1];
                if (!choice.autoCloseMenuAfterUse)
                {
                    AskWaitTaskMenu(ref d, t);
                }
                else
                {
                    Console.WriteLine("Using choice & auto closing wait menu...");
                }
                choice.Use(ref d, t);
            }
            return(preMenu);
        }
示例#9
0
        public void OnCommand(GameClient client, string[] args)
        {
            if (IsSpammingCommand(client.Player, "task"))
            {
                return;
            }

            if (args.Length > 1)
            {
                if (args[1] == "abort")
                {
                    if (client.Player.Task != null && client.Player.Task.TaskActive)
                    {
                        client.Player.Task.ExpireTask();
                    }
                }
            }
            else
            {
                GamePlayer player = client.Player;

                // TaskCommand(client.Player);
                if (player.Task != null)
                {
                    player.Task.CheckTaskExpired();
                }

                AbstractTask task = player.Task;

                if (task != null && task.TaskActive)
                {
                    var messages = new List <string>();
                    messages.Add("You are on " + task.Name);
                    messages.Add("What to do: " + task.Description);
                    messages.Add(" ");
                    messages.Add("Task will expire at " + task.TimeOut.ToShortTimeString());
                    messages.Add("You have done " + task.TasksDone + " tasks out of " + AbstractTask.MaxTasksDone(player.Level) + " until now.");
                    player.Out.SendCustomTextWindow("Tasks (Snapshot)", messages);
                }
                else if (task != null && task.TasksDone >= AbstractTask.MaxTasksDone(player.Level))
                {
                    player.Out.SendMessage("You can do no more tasks at your current level", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                }
                else
                {
                    player.Out.SendMessage("You have currently no pending task", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                }
            }
        }
示例#10
0
        protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
        {
            var dayNumber = preMenu.planning.GetNextNonEmptyDayIndex(d) + 1;

            if (preMenu.planning.AskConfirmation($"Do you want to jump to day number {dayNumber}, current number is {preMenu.planning.currentDayIndex} ? This is not reversible"))
            {
                cancelUse = false;
                preMenu.planning.SkipDaysUntilTask(d);
                d = preMenu.planning.GetCurrentDay();
            }
            else
            {
                cancelUse = true;
            }
        }
示例#11
0
        private void AddTask(AbstractTask task)
        {
            Trace.TraceInformation("{0} TicksManager.AddTask({1})", this.Name, task);

            lock (_locked) {
                _taskList.Add(task);
                if (_taskList.Count == 1 && _currentTask == null)
                {
                    Thread th = new Thread(new ThreadStart(TaskExecuteProcess));
                    th.IsBackground = true;
                    th.Name         = "Task Execute: " + this._symbolName;
                    th.Priority     = ThreadPriority.Lowest;
                    th.Start();
                }
            }
        }
 protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancel)
 {
     // Ask to select a AbstractTask in the planning implementation
     t = preMenu.planning.AskTaskToDo(d, t);
     if (t == null)
     {
         cancel = true;
     }
     else
     {
         cancel = false;
         Console.WriteLine("Selected");
         preMenu.planning.OnRequestSelectNewTask(t);
         SelectedByUser?.Invoke(this, new FreemodeArg {
             selectedTask = t
         });
     }
 }
示例#13
0
        /// <summary>
        /// Perrforms the next task.
        /// </summary>
        private IEnumerator PerformNextTask()
        {
            activeTask = tasks.Dequeue();
            var performingTask = true;

            activeTask.DoTask(this, storages[nextStorageIndex], () =>
            {
                tasks.Enqueue(activeTask);
                performingTask   = false;
                activeTask       = null;
                nextStorageIndex = (nextStorageIndex + 1) % storages.Count;
            });

            while (performingTask)
            {
                yield return(new WaitForEndOfFrame());
            }
        }
示例#14
0
        public override AbstractPreMenu AskPreTaskMenu(ref AbstractDay d, AbstractTask t)
        {
            var choices = preMenu.availableChoices.FindAll(x => x.count > 0 && x.ShowBeforeTask());

            if (choices.Count == 0)
            {
                Console.WriteLine("Skipping Pre Day menu because no options available");
                return(preMenu);
            }

            int selectedChoice = -1;

            Console.WriteLine("\n//////////////Pre Task menu////////////////");
            Console.WriteLine("This menu allows you to choose some options before starting the planning");
            int            curIndex = 1;
            ConsoleRoadmap r        = new ConsoleRoadmap(this);

            r.ShowRoadmapDay(d);
            foreach (var choice in choices)
            {
                if (choice.IsSelectable(out string msg))
                {
                    Console.WriteLine(curIndex + ")\t" + choice.GetName() + $" {choice.count}/{choice.maxCount}");
                }
                else
                {
                    Console.WriteLine("[Locked]\t" + choice.GetName());
                    Console.WriteLine("\t|\t" + msg);
                }
                curIndex++;
            }
            int quitChoice = curIndex;

            Console.WriteLine(quitChoice + ")\tClose the menu and start task");
            selectedChoice = SecureIntInput(1, curIndex, "Choose your option before starting the task : " + t.Infos.name);
            if (selectedChoice != quitChoice)
            {
                Console.WriteLine("Using choice ...");
                choices[selectedChoice - 1].Use(ref d, t);
                AskPreTaskMenu(ref d, t);
            }
            return(preMenu);
        }
示例#15
0
            // Similar to AbstractTask but doesn't need to track child tasks
            public void Compute()
            {
                Spliterator <S> rightSplit = Spliterator, leftSplit;
                long            sizeEstimate = rightSplit.EstimateSize(), sizeThreshold;

                if ((sizeThreshold = TargetSize) == 0L)
                {
                    TargetSize = sizeThreshold = AbstractTask.SuggestTargetSize(sizeEstimate);
                }
                bool               isShortCircuit = StreamOpFlag.SHORT_CIRCUIT.isKnown(Helper.StreamAndOpFlags);
                bool               forkRight      = false;
                Sink <S>           taskSink       = Sink;
                ForEachTask <S, T> task           = this;

                while (!isShortCircuit || !taskSink.cancellationRequested())
                {
                    if (sizeEstimate <= sizeThreshold || (leftSplit = rightSplit.TrySplit()) == null)
                    {
                        task.Helper.CopyInto(taskSink, rightSplit);
                        break;
                    }
                    ForEachTask <S, T> leftTask = new ForEachTask <S, T>(task, leftSplit);
                    task.AddToPendingCount(1);
                    ForEachTask <S, T> taskToFork;
                    if (forkRight)
                    {
                        forkRight  = false;
                        rightSplit = leftSplit;
                        taskToFork = task;
                        task       = leftTask;
                    }
                    else
                    {
                        forkRight  = true;
                        taskToFork = leftTask;
                    }
                    taskToFork.Fork();
                    sizeEstimate = rightSplit.EstimateSize();
                }
                task.Spliterator = null;
                task.PropagateCompletion();
            }
示例#16
0
    /// <summary>
    /// Creates the tree that is used to represent the htn.
    /// </summary>
    private void CreateTree()
    {
        // Preconditions
        Precondition enoughFood = new Precondition(preconditions.IsFoodLessThan);

        // Actions
        ActionDelegate buildCitizenAction = new ActionDelegate(actions.BuildCitizen);

        // Abstract Tasks
        Task createCitizen = new AbstractTask(this);

        createCitizen.AddPrecondition(enoughFood);

        // Primitive Tasks
        Task buildCitizenT = new PrimitiveTask(this)
        {
            action = new Action(5F, buildCitizenAction)
        };

        // Create tree structure
        createCitizen.AddSubtask(buildCitizenT);

        htn = new HierarchicalTaskNetwork(createCitizen);
    }
示例#17
0
        private void TaskExecuteProcess()
        {
            Trace.TraceInformation("{0} TicksManager.TaskExecuteProcess() - Start", this.Name);

            while ((_currentTask = this.ReadTask()) != null)
            {
                Trace.TraceInformation("{0} - StartTask={1}", this.Name, _currentTask.Task);
                this.OnStartTask(new TicksManagerTaskEventArgs(_currentTask.Task));
                _abortTask = false;

                switch (_currentTask.Task)
                {
                case TicksManagerTask.DataCaching:
                    this.ExecuteTaskDataCaching();
                    break;

                case TicksManagerTask.UpdateHistory:
                    this.ExecuteTaskUpdateTicks(_currentTask as TaskUpdateTicks);
                    break;
                }

                this.OnStopTask(new TicksManagerTaskEventArgs(_currentTask.Task));

                if (_abortTask)
                {
                    Trace.TraceInformation("{0} - AbortTask={1}", this.Name, _currentTask.Task);
                    ChangeTaskPriority();
                }
                else
                {
                    Trace.TraceInformation("{0} - StopTask={1}", this.Name, _currentTask.Task);
                }
            }
            _currentTask = null;
            Trace.TraceInformation("{0} TicksManager.TaskExecuteProcess() - Stop", this.Name);
        }
示例#18
0
 private static int CompareByTaskPriority(AbstractTask task1, AbstractTask task2)
 {
     return(task1.Priority.CompareTo(task2.Priority));
 }
示例#19
0
 public override AbstractTask AskTaskToDo(AbstractDay day, AbstractTask t)
 {
     Console.WriteLine("[IA] Choosing the next task to do...");
     return(day.GetNextTaskToDo());
 }
示例#20
0
 public AbstractTask AppendTask(AbstractTask task)
 {
     task.SetTaskInitiator(this);
     return(taskModule.AppendTask(task));
 }
示例#21
0
 public void RemoveTask(AbstractTask task)
 {
     taskModule.RemoveTask(task);
 }
示例#22
0
 private static void Alaram(UpdateTaskExecuteLogRequest req2, NodeTaskRunTimeInfo task, AbstractTask abstracttask)
 {
     if (task.TaskModel.isenablealarm == 1)
     {
         string        alarmperson = task.TaskModel.alarmtype == (int)AlarmType.Email ? abstracttask.GetAlarmEmailList() : abstracttask.GetAlarmMobileList();
         string        title       = "任务名称(" + task.TaskModel.taskname + ")" + req2.RunStatus.description() + ",请及时处理!";
         StringBuilder strContent  = new StringBuilder();
         strContent.AppendLine("所在节点名称(编号):" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeID + ")<br/>");
         strContent.AppendLine("任务名称(编号):" + task.TaskModel.taskname + "(" + task.TaskModel.id + ")<br/>");
         strContent.AppendLine("任务类型:" + ((TaskType)task.TaskModel.tasktype).description() + "<br/>");
         strContent.AppendLine("任务执行参数:" + task.TaskVersionModel.taskparams + "<br/>");
         strContent.AppendLine("任务执行日志:" + req2.LogMsg + "<br/>");
         strContent.AppendLine("任务执行结果,状态:" + req2.RunStatus.description() + ",结果:" + JsonConvert.SerializeObject(req2.TaskResult) + "<br/>");
         strContent.AppendLine("任务执行耗时(s):" + req2.TotalRunTime + "<br/>");
         AlarmHelper.AlarmAsync(task.TaskModel.isenablealarm, (AlarmType)task.TaskModel.alarmtype, alarmperson, title, strContent.ToString());
     }
 }
示例#23
0
        public static RunTaskResult TryRunTask(this AbstractTask task, string nextRunTime, NodeTaskRunTimeInfo taskruntimeinfo)
        {
            RunTaskResult result = new RunTaskResult()
            {
                RunStatus = (int)RunStatus.Failed
            };
            string logId = "";
            long   times = 0;

            Model.enums.ExecuteStatus executestatus = Model.enums.ExecuteStatus.ExecuteSucess;
            try
            {
                task.ShowProcessIngLog("----------------------" + DateTime.Now + ":开始执行任务-----------------------------------------");
                DateTime startTime = DateTime.Now;
                //开始执行任务,上报开始执行日志,并更新任务版本状态为执行中
                #region 开始执行任务,上报开始执行日志,并更新任务版本状态为执行中
                AddTaskExecuteLogRequest req = new AddTaskExecuteLogRequest()
                {
                    NodeId        = GlobalNodeConfig.NodeID,
                    RunStatus     = Model.enums.ExecuteStatus.Executing,
                    Source        = Model.Source.Node,
                    StartTime     = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    TaskId        = taskruntimeinfo.TaskModel.id,
                    TaskParams    = taskruntimeinfo.TaskVersionModel.taskparams,
                    TaskVersionId = taskruntimeinfo.TaskVersionModel.id,
                    NextRunTime   = nextRunTime
                };
                var r2 = NodeProxy.PostToServer <AddTaskExecuteLogResponse, AddTaskExecuteLogRequest>(ProxyUrl.AddTaskVersionExecuteLog_Url, req);
                if (r2.Status != ResponesStatus.Success)
                {
                    task.ShowProcessIngLog("上报任务(taskid=" + task.TaskDetail.id + "taskversionid=" + task.TaskVersionDetail.id + ")的执行日志失败,请求地址:" + ProxyUrl.AddTaskVersionExecuteLog_Url + ",请求参数:" + JsonConvert.SerializeObject(req) + ",服务器返回参数:" + JsonConvert.SerializeObject(r2));
                }
                logId = r2.Data.LogId;
                #endregion

                Stopwatch sw = new Stopwatch();
                sw.Start();
                try
                {
                    result = task.RunTask();
                }
                catch (Exception ex)
                {
                    result = new RunTaskResult()
                    {
                        RunStatus = (int)RunStatus.Exception, Message = ex.Message, Ex = ex
                    };
                    task.ShowProcessIngLog("执行任务异常,异常信息:" + JsonConvert.SerializeObject(ex));
                }
                sw.Stop();

                TimeSpan ts = sw.Elapsed;
                times = sw.ElapsedMilliseconds / 1000;//秒

                executestatus = result.RunStatus == (int)RunStatus.Normal? Model.enums.ExecuteStatus.ExecuteSucess:(result.RunStatus == (int)RunStatus.Failed?ExecuteStatus.ExecuteFailed:ExecuteStatus.ExecuteException);
            }
            catch (Exception exp)
            {
                executestatus = Model.enums.ExecuteStatus.ExecuteException;
                task.ShowProcessIngLog("执行任务异常,异常信息:" + JsonConvert.SerializeObject(exp));
            }
            finally
            {
                #region 执行任务完毕,上报开始执行日志,并更新任务版本状态为执行中
                task.ShowProcessIngLog("上报任务状态:" + executestatus);
                task.ShowProcessIngLog("----------------------" + DateTime.Now + ":执行任务完成-----------------------------------------");

                DateTime endTime = DateTime.Now;
                //上报任务执行日志和执行结果,并更新最后一次任务状态
                UpdateTaskExecuteLogRequest req2 = new UpdateTaskExecuteLogRequest()
                {
                    NodeId        = GlobalNodeConfig.NodeID,
                    RunStatus     = executestatus,
                    Source        = Model.Source.Node,
                    EndTime       = endTime.ToString("yyyy-MM-dd HH:mm:ss"),
                    TaskId        = taskruntimeinfo.TaskModel.id,
                    TaskResult    = result,
                    LogId         = string.IsNullOrEmpty(logId)?0: int.Parse(logId),
                    TotalRunTime  = times.ToString(),
                    TaskVersionId = taskruntimeinfo.TaskVersionModel.id,
                    LogMsg        = task.GetLog(),
                };
                if (!string.IsNullOrEmpty(logId))
                {
                    var r3 = NodeProxy.PostToServer <EmptyResponse, UpdateTaskExecuteLogRequest>(ProxyUrl.UpdateTaskVersionExecuteLog_Url, req2);
                    if (r3.Status != ResponesStatus.Success)
                    {
                        task.ShowProcessIngLog("上报任务(taskid=" + taskruntimeinfo.TaskModel.id + "taskversionid=" + taskruntimeinfo.TaskVersionModel.id + ")的执行日志失败,请求地址:" + ProxyUrl.AddTaskVersionExecuteLog_Url + ",请求参数:" + JsonConvert.SerializeObject(req2) + ",服务器返回参数:" + JsonConvert.SerializeObject(r3));
                    }
                }
                log.Info(task.GetLog().ToString());
                Alaram(req2, taskruntimeinfo, task);
                task.ClearLog();
                #endregion
            }
            return(result);
        }
示例#24
0
 public static bool UpdateTaskPauseStatus(this AbstractTask task, int isPauseStatus)
 {
     task.UpdateTaskPauseStatus(isPauseStatus);
     return(true);
 }
示例#25
0
 public void AddTask(AbstractTask task)
 {
     _queue.Enqueue(task);
 }
示例#26
0
 /// <summary>
 /// Changes task's state
 /// </summary>
 /// <param name="task">Task to change</param>
 private static void ChangeStatus(AbstractTask task)
 {
     task.TaskStatus = GetStatusFromUser("Enter new status");
 }
示例#27
0
 protected override void _Use(ref AbstractDay d, AbstractTask t, out bool cancelUse)
 {
     preMenu.planning.DecalWeek(d);
     d         = preMenu.planning.GetCurrentDay();
     cancelUse = false;
 }
示例#28
0
 public override AbstractPreMenu AskWaitTaskMenu(ref AbstractDay d, AbstractTask t)
 {
     Console.WriteLine("[IA] Selecting the wait options for the task...");
     return(preMenu);
 }
 internal UnassignedProcessorContext(AbstractTask task, IStreamConfig configuration)
     : base(task, configuration, null, null)
 {
     FollowMetadata = false;
 }
示例#30
0
 public override AbstractPreMenu AskPreTaskMenu(ref AbstractDay d, AbstractTask taskToDo)
 {
     Console.WriteLine("[IA] Selecting the options for the task..." + (d.tasks.FindAll(t => t.IsFinished).Count + 1) + "/" + d.tasks.Count);
     return(preMenu);
 }