/// <summary> /// スクリプト実行完了待ちスレッド /// </summary> /// <param name="argObj"></param> public void EventThread(Object argObj) { ThreadArgs args = (ThreadArgs)argObj; int[] hdl = new int[1] { args._event._number }; int ret; if (args._timeOut == 0) { ret = VM.Wait(hdl, Timeout.Infinite); } else { ret = VM.Wait(hdl, args._timeOut); } if (ret == WaitHandle.WaitTimeout) { if (_progThread != null) { _progThread.Abort(); } //MessageBox.Show("指定時間内に指定プログラムが完了しませんでした", "エラー", (MessageBoxButton.OK), (MessageBoxImage.Error)); pythonConsole.Pad.Console.WriteLine("指定時間内に指定プログラムが完了しませんでした", Microsoft.Scripting.Hosting.Shell.Style.Out); _progThread = null; } else { if (args._event.Status() == 3) { // MessageBox.Show("実行が中断されました", "中断", (MessageBoxButton.OK), (MessageBoxImage.Stop)); } } Dispatcher.Invoke(new Action(() => { //「待ち」解除 pythonConsole.Pad.Console.RunStatements("\n"); //ボタンを非選択 ProgExecBtn.IsChecked = false; })); }
/// <summary> /// スクリプト実行スレッド /// </summary> /// <param name="source"></param> public void execute_script(string source) { PEventManager.PEvent ev = VM.GetEvent(); ThreadArgs args = new ThreadArgs(); args.vm = VM; args.cmd = source; args._event = ev; args._timeOut = Int32.Parse(ProgTimeOut.Text); //スクリプト実行待ちのスレッド _waitThread = new Thread(new ParameterizedThreadStart(EventThread)); //スクリプト・スレッド _progThread = new Thread(new ParameterizedThreadStart(ScriptThread)); _waitThread.Start(args); _progThread.Start(args); }
/// <summary> /// スクリプト・スレッド /// </summary> /// <param name="argObj"></param> public void ScriptThread(Object argObj) { ThreadArgs args = (ThreadArgs)argObj; try { ScriptSource src = pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromString(args.cmd); Object obj = src.Execute(pythonConsole.Pad.Console.ScriptScope); } catch (Exception err) { //スクリプトの実行で例外発生 // (スレッドのAbortでも例外となる) string errMsg = pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); // MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); //コンソールにメッセージを表示する pythonConsole.Pad.Console.WriteLine(errMsg, Microsoft.Scripting.Hosting.Shell.Style.Out); args._event.Cancel(-2); return; } args._event.Set(0); }
/// <summary> /// スクリプト・スレッド /// </summary> /// <param name="argObj"></param> public static void ScriptThread(Object argObj) { ThreadArgs args = (ThreadArgs)argObj; Trace.TraceFormat("Script Start:ID={0}", args._event._number); try { ScriptSource src = _pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromString(args.cmd); Object obj = src.Execute(_pythonConsole.Pad.Console.ScriptScope); //この場合、例外はコンソール内で取得、表示される。また、実行開始が非常に遅い(?) //スクリプトの実行エラーをイベントとして通知する必要があるので、この方法は不可とする // args.vm._ExecuteScript(args.vm, new ScriptEventArgs(args.cmd)); } catch (Exception err) { //スクリプトの実行で例外発生 string errMsg = _pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); Trace.TraceFormat("[ERR]Script:{0}", errMsg); // MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); _pythonConsole.Pad.Console.WriteLine(errMsg, Microsoft.Scripting.Hosting.Shell.Style.Out); args._event.Cancel(-2); args.vm._scriptThread = null; return; } finally{ //例外が発生した場合でも、return 後に finally が実行される //Script内で printなどを行っていると、コンソールが「待ち」になってしまうので //ダミーの改行でコンソールの「待ち」を解除する args.vm._ExecuteScript(args.vm, new ScriptEventArgs("\n")); } args._event.Set(0); args.vm._scriptThread = null; Trace.TraceFormat("Script Complete"); }
/// <summary> /// コマンド受信スレッド /// </summary> unsafe private void CommandThread(Object argObj) { //引数の展開 object[] argsTmp = (object[])argObj; byte[] buffer = new byte[1024]; //ソケットの生成 _sock = new SockCtrl(); _sock.Init(_serverIP, (int)argsTmp[0]); while (_sock.listener == null) { Thread.Sleep(10); } try { _sock.listener.Pending(); } catch (Exception err) { _sock.listener.Start(); } while (true) { if (_sock.listener.Pending() == true) { _sock.Accept(); ConnectionMsg = "接続中"; Trace.TraceFormat("Socket Connected"); int len = 0; NetworkStream stream = _sock.stream; MemoryStream ms = new MemoryStream(); int cmdMode = 0; bool loop = true; while (loop) { //コマンド文字列受信 do { try { len = stream.Read(buffer, 0, 1); if (len == 0) { //クライアント側から切断された loop = false; ms.Position = 0; ms.Dispose(); break; } ms.Write(buffer, 0, len); } catch (Exception err) { //Read中に切断された //MessageBox.Show("CMD::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; ms.Flush(); ms.Position = 0; ms.Dispose(); break; } //コマンドの最終文字は';' または'@'とする if (buffer[0] == ';') { cmdMode = 1; break; } if (buffer[0] == '@') { cmdMode = 2; break; } if (buffer[0] == '?') { cmdMode = 3; break; } }while (stream.DataAvailable); //コマンドを受信した if (loop == true && (int)ms.Position != 0) { Encoding enc = Encoding.UTF8; string cmd = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length - 1); ms.Flush(); ms.Position = 0; ms.Dispose(); //コマンドスクリプトを実行する if (cmdMode == 1) { MessageData msg; try { ScriptSource src = _pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromString(cmd); Object obj = src.Execute(_pythonConsole.Pad.Console.ScriptScope); msg = CreateMsg(MessageCode.SYS_CMD_RETOK, obj); } catch (Exception err) { //スクリプトの実行で例外発生 string errMsg = _pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); Trace.TraceFormat("[ERR]Script:{0}", errMsg); //MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); _pythonConsole.Pad.Console.WriteLine(errMsg, Microsoft.Scripting.Hosting.Shell.Style.Out); msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); } try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } } else if (cmdMode == 3) { //スクリプトファイルで実行 MessageData msg; try { ScriptSource src = _pythonConsole.Pad.Console.ScriptScope.Engine.CreateScriptSourceFromFile(cmd); Object obj = src.Execute(_pythonConsole.Pad.Console.ScriptScope); msg = CreateMsg(MessageCode.SYS_CMD_RETOK, obj); } catch (Exception err) { //スクリプトの実行で例外発生 string errMsg = _pythonConsole.Pad.Console.ScriptScope.Engine.GetService <ExceptionOperations>().FormatException(err); Trace.TraceFormat("[ERR]Script:{0}", errMsg); // MessageBox.Show(errMsg, "err", MessageBoxButton.OK, MessageBoxImage.Error); msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); } try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket Write:{0}", err.Message); //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } _ExecuteScript(this, new ScriptEventArgs("\n")); } else { // 別スレッドでのコマンド実行 bool threadRun = true; if (_scriptThread != null) { if (_scriptThread.ThreadState != ThreadState.Stopped) { //前回のスクリプトスレッドが動作中 Trace.TraceFormat("Script already Run"); MessageData msg = CreateMsg(MessageCode.SYS_CMD_RETNG, (int)ErrCode.ERR_EXEC); try { //結果を送信する stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket Write:{0}", err.Message); //MessageBox.Show("CMD_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; threadRun = false; } threadRun = false; } } if (threadRun == true) { //スクリプト実行のイベント PEventManager.PEvent evObj = GetEvent(); ThreadArgs args = new ThreadArgs(); args.vm = this; args.cmd = cmd; args._event = evObj; _scriptThread = new Thread(new ParameterizedThreadStart(ScriptThread)); _scriptThread.Start(args); Trace.TraceFormat("Script thread started"); //execute_program() のリターン用データ MessageData msg = CreateMsg(MessageCode.SYS_CMD_RETOK, evObj._number); try { stream.Write(msg.Binary(), 0, Marshal.SizeOf(msg)); } catch (Exception err) { Trace.TraceFormat("[ERR]Socket:{0}", err.Message); //MessageBox.Show("SCR_Write::" + err.Message, "警告", MessageBoxButton.OK, MessageBoxImage.Warning); WriteConsole(err.Message); loop = false; } } } ms = new MemoryStream(); } } _sock.Close(); ConnectionMsg = "未接続"; _threadRestart = 1; Trace.TraceFormat("Socket DisConnected"); } else { Thread.Sleep(500); if (_threadStop != 0) { break; } } } _sock.Close(); ConnectionMsg = "未接続"; _threadRestart = 1; Trace.TraceFormat("Socket DisConnected"); }