diff --git a/PluginsSupport/Interfaces.cs b/PluginsSupport/Interfaces.cs index e2ec50b27..e74d34f84 100644 --- a/PluginsSupport/Interfaces.cs +++ b/PluginsSupport/Interfaces.cs @@ -396,6 +396,7 @@ namespace VisualPascalABCPlugins void WriteToOutputBox(string message, bool is_exc); void ClearOutputTextBoxForTabPage(ICodeFileDocument tabPage); void AddTabWithUrl(string title, string url); + void AddTextToCompilerMessagesSync(string text); } public interface IWorkbenchOptionService diff --git a/VisualPascalABCNET/DS/RunManager/RunManager.cs b/VisualPascalABCNET/DS/RunManager/RunManager.cs index 3f3979033..dc6bc5e70 100644 --- a/VisualPascalABCNET/DS/RunManager/RunManager.cs +++ b/VisualPascalABCNET/DS/RunManager/RunManager.cs @@ -302,7 +302,11 @@ namespace VisualPascalABC File.AppendAllText("logRun.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); #endif RemoveFromTables(fileName); - throw; + // перехватываю! + //PRunner.ProcessExited -= new EventHandler(PRunner_ProcessExited); + //if (Exited != null) + // Exited(fileName); + throw; // Это не перехватывается и приводит к вылету оболочки - SSM 22/04/19 } } diff --git a/VisualPascalABCNET/Workbench/RunService.cs b/VisualPascalABCNET/Workbench/RunService.cs index 4905a6891..5e8c05cce 100644 --- a/VisualPascalABCNET/Workbench/RunService.cs +++ b/VisualPascalABCNET/Workbench/RunService.cs @@ -188,7 +188,10 @@ namespace VisualPascalABC } catch (System.Exception e) { - throw; + // SSM 22/04/19 - исправляю вылет оболочки при отсутствии exe файла + this.RunnerManager_Exited(OutputFileName); + WorkbenchServiceFactory.OperationsService.AddTextToOutputWindowSync(OutputFileName,"Произошла непредвиденная ошибка. Вероятно, на диске отсутствует .exe-файл. Повторите запуск"); + //throw; } if (!ProjectFactory.Instance.ProjectLoaded) DocumentService.ActiveCodeFileDocument = tabPage; diff --git a/VisualPascalABCNET/Workbench/RunnerManagerHandlers.cs b/VisualPascalABCNET/Workbench/RunnerManagerHandlers.cs index 2fae7412b..2059b012b 100644 --- a/VisualPascalABCNET/Workbench/RunnerManagerHandlers.cs +++ b/VisualPascalABCNET/Workbench/RunnerManagerHandlers.cs @@ -21,7 +21,8 @@ namespace VisualPascalABC void RunnerManager_Started(string fileName) { - Workbench.BeginInvoke(new SetTextDelegate(RunnerManager_Started_Sync), fileName); + RunnerManager_Started_Sync(fileName); + //Workbench.BeginInvoke(new SetTextDelegate(RunnerManager_Started_Sync), fileName); } void ButtonsEnableDisable_RunStart() @@ -59,11 +60,6 @@ namespace VisualPascalABC } } - void RunnerManager_Started_Sync_Thread(object fileName) - { - RunnerManager_Started_Sync(fileName as string); - } - void RunnerManager_OutputStringReceived(string fileName, RunManager.StreamType streamType, string text) { WorkbenchServiceFactory.OperationsService.AddTextToOutputWindowSync(fileName, text); @@ -74,11 +70,22 @@ namespace VisualPascalABC fileName = Tools.FileNameToLower(fileName); if (!RunTabs.ContainsKey(fileName)) { - string s = fileName + " "; + string s = "Closing: "+fileName + " \nRunTabs: "; foreach (string ss in RunTabs.Keys) s += ss + " "; throw new Exception(s); } + RunTabs[fileName].Run = false; + WorkbenchServiceFactory.DocumentService.SetTabPageText(RunTabs[fileName]); + if (ReadRequests.ContainsKey(RunTabs[fileName])) + ReadRequests.Remove(RunTabs[fileName]); + UpdateReadRequest(false); + WorkbenchServiceFactory.EditorService.SetFocusToEditor(); + //if (TerminateAllPrograms) + WaitCallback_DeleteEXEAndPDB(fileName); // сделал всё синхронно - теперь WaitCallback_DeleteEXEAndPDB не должен работать медленно! + //else + // System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback_DeleteEXEAndPDB, fileName); // в потоке - не синхронизировано! Надо запретить запускать что-то до окончания! + if (!ProjectFactory.Instance.ProjectLoaded) { if (Tools.FileNameToLower(WorkbenchServiceFactory.Workbench.CurrentEXEFileName) == fileName) @@ -89,17 +96,7 @@ namespace VisualPascalABC else { ButtonsEnableDisable_RunStop(); - } - RunTabs[fileName].Run = false; - WorkbenchServiceFactory.DocumentService.SetTabPageText(RunTabs[fileName]); - if (ReadRequests.ContainsKey(RunTabs[fileName])) - ReadRequests.Remove(RunTabs[fileName]); - UpdateReadRequest(false); - WorkbenchServiceFactory.EditorService.SetFocusToEditor(); - if (TerminateAllPrograms) - WaitCallback_DeleteEXEAndPDB(fileName); - else - System.Threading.ThreadPool.QueueUserWorkItem(WaitCallback_DeleteEXEAndPDB, fileName); + } // SSM 22/04/19 - этот код перенесен в конец WaitCallback_DeleteEXEAndPDB - нет, там исключение } void RunnerManager_RunnerManagerUnhanledRuntimeException(string id, string ExceptionType, string ExceptionMessage, string StackTraceData, List StackTrace) @@ -152,21 +149,35 @@ namespace VisualPascalABC void WaitCallback_DeleteEXEAndPDB(object state) { - int i = 0; + //int i = 0; string fileName = (string)state; - while (i < 20) + //while (i < 20) // 20 раз пытаться удалять! Это сильно! + //{ + try { - try + if (Workbench.UserOptions.DeleteEXEAfterExecute && File.Exists(fileName)) + File.Delete(fileName); + } + catch + { + WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить EXE-файл"); + } + try + { + if (Workbench.UserOptions.DeletePDBAfterExecute) { - if (Workbench.UserOptions.DeleteEXEAfterExecute && File.Exists(fileName)) - File.Delete(fileName); - if (Workbench.UserOptions.DeletePDBAfterExecute) - { - string pdbFileName = Path.ChangeExtension(fileName, ".pdb"); - if (File.Exists(pdbFileName) && File.Exists(pdbFileName)) - File.Delete(pdbFileName); - } - if (RunnerManager.TempBatFiles.ContainsKey(fileName)) + string pdbFileName = Path.ChangeExtension(fileName, ".pdb"); + if (File.Exists(pdbFileName)) + File.Delete(pdbFileName); + } + } + catch + { + WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить PDB-файл"); + } + try + { + if (RunnerManager.TempBatFiles.ContainsKey(fileName)) { string batname = RunnerManager.TempBatFiles[fileName]; if (File.Exists(batname)) @@ -175,14 +186,27 @@ namespace VisualPascalABC RunnerManager.TempBatFiles.Remove(fileName); } } - return; - } - catch - { - } - System.Threading.Thread.Sleep(20); - i++; } + catch + { + WorkbenchServiceFactory.OperationsService.AddTextToCompilerMessagesSync("Не удалось удалить bat-файл из словаря RunnerManager.TempBatFiles"); + } + // SSM 22/04/19 - этот код перенесён сюда из RunnerManager_Exited_Sync - нет, тут исключение! + /*if (!ProjectFactory.Instance.ProjectLoaded) + { + if (Tools.FileNameToLower(WorkbenchServiceFactory.Workbench.CurrentEXEFileName) == fileName) + { + ButtonsEnableDisable_RunStop(); + } + } + else + { + ButtonsEnableDisable_RunStop(); + }*/ + //return; + //System.Threading.Thread.Sleep(20); + //i++; + //} } void ReadStringRequest(string ForId) diff --git a/bin/Lib/WPFObjects.pas b/bin/Lib/WPFObjects.pas index b6a590be1..eb001d259 100644 --- a/bin/Lib/WPFObjects.pas +++ b/bin/Lib/WPFObjects.pas @@ -242,7 +242,7 @@ type /// Правый нижний угол графического объекта property RightBottom: Point read Pnt(Left + Height,Top + Height); /// Угол поворота графического объекта (по часовой стрелке) - property RotateAngle: real read InvokeReal(()->rot.Angle) write Invoke(procedure->rot.Angle := value); + property RotateAngle: real read InvokeReal(()->rot.Angle) write Invoke(procedure->begin rot.CenterX := Width/2; rot.CenterY := Height/2; rot.Angle := value end); /// Множитель масштабирования объекта property ScaleFactor: real read InvokeReal(()->sca.ScaleX) write Invoke(()->begin (sca.ScaleX, sca.ScaleY) := (value,value); end); // Центр поворота графического объекта - запретил, т.к. это будет сбивать координаты объекта @@ -439,13 +439,24 @@ type CircleWPF = class(BoundedObjectWPF) private procedure InitOb2(x,y,r: real; c: GColor) := InitOb1(x-r,y-r,2*r,2*r,c,new System.Windows.Shapes.Ellipse()); - procedure WT(value: real) := (ob.Width,ob.Height) := (value,value); - procedure HT(value: real) := (ob.Width,ob.Height) := (value,value); + procedure WT(value: real) := begin (ob.Width,ob.Height) := (value,value); (gr.Width,gr.Height) := (value,value); end; + procedure HT(value: real) := begin (ob.Width,ob.Height) := (value,value); (gr.Width,gr.Height) := (value,value); end; + + {procedure Rad(value: real); + begin + var delta := value - gr.Width/2; + Left -= delta; + Top -= delta; + (gr.Width,gr.Height) := (value*2,value*2); + Element.Points := ChangePointCollection(value,n); + end;} + procedure Rad(value: real); begin //(ob as Ellipse).RenderedGeometry - Left -= value - ob.Width/2; - Top -= value - ob.Width/2; + Left -= value - gr.Width/2; + Top -= value - gr.Width/2; + (gr.Width,gr.Height) := (value*2,value*2); (ob.Width,ob.Height) := (value*2,value*2); end; function GetInternalGeometry: Geometry; override := (ob as Shape).RenderedGeometry; @@ -662,7 +673,7 @@ type write Invoke(()->begin Self.Element.bc := value; Self.Element.RecreateFormText; ob.InvalidateVisual end); /// Текст графического объекта property Text: string read InvokeString(()->Element.Text) - write Invoke(procedure->begin Self.Element.Text := value; Self.Element.RecreateFormText; ; Width := Self.Element.Width; Height := Self.Element.Height; ob.InvalidateVisual end); override; + write Invoke(procedure->begin Self.Element.Text := value; Self.Element.RecreateFormText; Width := Self.Element.Width; Height := Self.Element.Height; ob.InvalidateVisual end); override; /// Декоратор поворота объекта function WithRotate(da: real): TextWPF := inherited WithRotate(da) as TextWPF; end;