private Task <object> Execute(CommandModel cmd, InterpretationData data) { return(Task.Factory.StartNew <object>(() => { int milliseconds = (int)Interpreter.ExecuteCommand(cmd.GetParameters()[0], data); Stopwatch sw = new Stopwatch(); sw.Start(); while (sw.ElapsedMilliseconds < milliseconds) { if (data.Stopper.IsStopped) { throw new StopException(); } if (milliseconds - sw.ElapsedMilliseconds > 1100) { Thread.Sleep(1000); } if (milliseconds - sw.ElapsedMilliseconds > 50) { Task.Delay(1).Wait(); } } sw.Stop(); return milliseconds; }, TaskCreationOptions.LongRunning)); }
private Task <object> Execute(CommandModel cmd, InterpretationData data) { return(Task.Run(new Func <object>(() => { var parameters = cmd.GetParameters(); if (parameters.Length != 1) { throw new WrongNumberOfParametersException(parameters.Length, 1); } object num = Interpreter.ExecuteCommand(parameters[0], data); if (!(num is int)) { throw new ConversionFailedException("Не удаётся конвертировать " + parameters[0] + " в int."); } int numberRepetitions = (int)num; string script = cmd.Command; int bracerIndex = script.IndexOf('{'); script = script.Substring(bracerIndex + 1, (script.Length - 1) - bracerIndex - 1).Trim(); while (numberRepetitions-- > 0) { try { Interpreter.ExecuteScript(script, data); } catch (BreakException) { break; } catch (Exception e) { throw e; }//прокидываем выше } return null; }))); }
public Task <object> TryExecute(CommandModel cmd, InterpretationData data) { if (cmd.KeyWord == "CheckVar" && cmd.GetParameters().Length == 1) { return(Execute(cmd, data)); } return(null); }
private Task <object> Execute(CommandModel cmd, InterpretationData data) { return(Task.Run(new Func <object>(() => { var pars = cmd.GetParameters(); if (pars.Length == 1) { return data.Vars.HasVar(Interpreter.ExecuteCommand(pars[0].Trim(), data).ToString()); } return false; }))); }
private Task <object> Execute(CommandModel cmd, InterpretationData data) { return(Task.Factory.StartNew(new Func <object>(() => { string description = ""; if (cmd.Command.StartsWith("[")) { description = cmd.Command.Substring(0, cmd.Command.IndexOf("func") - 1).Trim(); description = description.Remove(description.Length - 1, 1).Remove(0, 1); } CommandModel newModel = new CommandModel(cmd.Command.Substring(cmd.Command.IndexOf("func") + 4).Trim()); string name = newModel.KeyWord; string script = cmd.Command; int bracerIndex = script.IndexOf('{'); script = script.Substring(bracerIndex + 1, (script.Length - 1) - bracerIndex - 1).Trim(); var buf = new UserFunc(name, newModel.GetParameters(), script, description); data.InterpretationFuncs.RemoveAll(func => func.Name == buf.Name); data.InterpretationFuncs.Add(buf); return null; }), TaskCreationOptions.AttachedToParent)); }
private bool IsValidConstruction(CommandModel cmd, InterpretationData data) { return(cmd.KeyWord.StartsWith("Delay") && cmd.GetParameters().Length == 1); }
private bool IsValidConstruction(CommandModel cmd) { return(cmd.KeyWord == "if" && cmd.GetParameters().Length == 1); }
public static object ExecuteCommand(string cmdString, InterpretationData data) { if (data.Stopper.IsStopped) { throw new StopException(); } CommandModel cmd = new CommandModel(cmdString.Trim()); Task <object> commandTask = null; if (Converter.CanConvertToSimpleType(cmd.Command))//берём простой тип { commandTask = Converter.ToSimpleType(cmd.Command); } if (commandTask == null) { SyntacticConstructionsManager.TryExecute(cmd, data, out commandTask); } if (commandTask == null) { //ищем функцию по имени во всей библиотеке, начинаем с функций этой интерпретации IInterpreterFunction func = data.InterpretationFuncs.FirstOrDefault(Func => Func.Name == cmd.KeyWord); if (func == null) { func = AdditionalLibrary.FirstOrDefault(Func => Func.Name == cmd.KeyWord); } if (func == null) { func = MainLibrary.FirstOrDefault(Func => Func.Name == cmd.KeyWord); } if (func != null) { var stringParameters = cmd.GetParameters(); object[] parameters = new object[stringParameters.Length]; for (int i = 0; i < parameters.Length; i++) { parameters[i] = ExecuteCommand(stringParameters[i], data); } commandTask = func.GetResult(parameters, data); } } if (commandTask == null)//если ничего не удалось, возвращаем входную команду, как строку { commandTask = Task.FromResult <object>(cmdString); } if (commandTask.Status == TaskStatus.Created)//если задача создана, но не запущена { commandTask.Start(); } if (cmd.IsAsync)//если асинхронно, на всё пофиг { return(null); } else { try { return(commandTask.Result); }//если что то не так, прокидываем исключение выше catch { throw commandTask.Exception.InnerException; }; } }