public static void Poll() { var update_list = new List <ScriptController>(); var remove_state = false; lock (controller_list_sync_) { /* 実行 */ foreach (var controller in controller_list_) { if ((controller.Poll()) && (!controller.IsDetach)) { update_list.Add(controller); } } /* デタッチ済みスクリプトを解放 */ remove_state = (controller_list_.RemoveAll(script => script.IsDetach) > 0); /* アップデートリストから削除済みコントローラを削除する */ update_list.RemoveAll(controller => !controller_list_.Contains(controller)); } if (update_list.Count > 0) { update_list.ForEach(controller => ControllerStatusUpdated?.Invoke(controller)); } if (remove_state) { ControllerListUpdated?.Invoke(); } }
private static void Clear() { var script_list = (List <ScriptFileController>)null; /* 新しいリストと入れ替え */ lock (controller_list_sync_) { script_list = controller_list_; controller_list_ = new List <ScriptFileController>(); } if (script_list.Count > 0) { var sw_timeout = new System.Diagnostics.Stopwatch(); /* 全スクリプトに停止要求 */ script_list.ForEach(script => script.StopAsync()); /* 全スクリプトが停止するまで待つ */ sw_timeout.Restart(); while ((sw_timeout.ElapsedMilliseconds < SCRIPT_STOP_TIMEOUT) && (!script_list.TrueForAll(script => script.Status == ScriptRunStatus.Stop)) ) { System.Threading.Thread.Sleep(100); } /* 残っているスクリプトを完全に停止させる */ controller_list_.ForEach(script => script.Stop()); ControllerListUpdated?.Invoke(); } }
public static ScriptController Register(string script_path, ScriptRunMode mode) { if (script_path == null) { return(null); } /* ファイルが存在しなければ無視 */ if (!File.Exists(script_path)) { return(null); } var controller = (ScriptFileController)null; var add_state = false; var update_state = false; lock (controller_list_sync_) { /* 登録リストから検索 */ controller = controller_list_.Find(script => script.ScriptPath == script_path); /* 未登録の場合は新規登録 */ if (controller == null) { controller = new ScriptFileController(script_path); controller_list_.Add(controller); add_state = true; } } /* モード変更 */ if ((controller != null) && (controller.Mode != mode)) { controller.Mode = mode; update_state = true; } /* イベント */ if (add_state) { ControllerListUpdated?.Invoke(); } else if (update_state) { ControllerStatusUpdated?.Invoke(controller); } return(controller); }