From bb16fbd02cc68b4ae844f7a50fa0541b81b3dfcc Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Wed, 19 Nov 2025 16:02:37 +0100 Subject: [PATCH] - aggiunto log a ExecProcess - commentato evento fine coda di esecuzione - aggiunta gestione standarderror - aggiunto flush dopo scrittura standardinput - aggiunto Id su Question per facilitare debug - aggiunto .Tray a file ini e log - introdotta copia DataRoot se RemoteDebug in postbuild --- .../ExecProcessManager.vb | 65 +++++++++++++------ .../My Project/AssemblyInfo.vb | 4 +- .../EgwMultiEngineManager.Data.vbproj | 6 +- EgwMultiEngineManager.Data/QuestionDTO.vb | 3 + .../Constants/ConstGen.vb | 2 +- .../Constants/ConstIni.vb | 2 +- .../EgwMultiEngineManager.Tray.vbproj | 6 +- .../MainWindow/MainWindowVM.vb | 3 + .../My Project/AssemblyInfo.vb | 4 +- .../Utility/EnvironmentManager.vb | 11 +++- EgwMultiEngineManager.Tray/packages.config | 1 + EgwMultiEngineManager.Tray/post-build.ps1 | 9 ++- ExtData/Tray.DataRoot.ini | 3 + 13 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 ExtData/Tray.DataRoot.ini diff --git a/EgwMultiEngineManager.Core/ExecProcessManager.vb b/EgwMultiEngineManager.Core/ExecProcessManager.vb index 198b79a..f2190a3 100644 --- a/EgwMultiEngineManager.Core/ExecProcessManager.vb +++ b/EgwMultiEngineManager.Core/ExecProcessManager.vb @@ -26,6 +26,11 @@ Public Class ExecProcessManager EVENT_ = 2 End Enum + Private Shared m_refEgtOutLog As Action(Of String) + Public Shared Sub SetEgtOutLog(value As Action(Of String)) + m_refEgtOutLog = value + End Sub + Private m_StatisticsTimer As New DispatcherTimer(DispatcherPriority.Background) Private disposedValue As Boolean @@ -153,6 +158,12 @@ Public Class ExecProcessManager #End Region ' CONSTRUCTORS + Friend Sub EgtOutLog(sMessage As String) + If Not IsNothing(m_refEgtOutLog) Then + m_refEgtOutLog(sMessage) + End If + End Sub + Public Function ArgumentsEnqueue(ProcessArgs As QuestionDTO) As Boolean If ProcessArgs.nId <= 0 OrElse ProcessArgs.Args.Count = 0 Then Return False SyncLock ArgumentsQueueLock @@ -366,27 +377,28 @@ Public Class ExecProcessManager Next End If ' verifico se coda vuota e tutti i processi hanno finito - Dim nQueueArgs As Integer = 0 - SyncLock ArgumentsQueueLock - nQueueArgs = m_ArgumentsQueue.Count - End SyncLock - If nQueueArgs = 0 Then - Dim bProcessWaiting As Boolean = False - For Each ThreadData In m_ThreadDataList - If ThreadData.ProcessStatus = ThreadData.ProcessStatuses.WAITINGANSWER OrElse ThreadData.ProcessStatus = ThreadData.ProcessStatuses.ANSWERRECEIVED Then - bProcessWaiting = True - Exit For - End If - Next - If Not bProcessWaiting Then - ' creo thread per lanciare evento asincrono di fine calcolo - Dim AllArgsProcessedThread = New Thread(Sub() - RaiseEvent m_AllArgsProcessed() - End Sub) - AllArgsProcessedThread.SetApartmentState(ApartmentState.STA) - AllArgsProcessedThread.Start() - End If - End If + 'Dim nQueueArgs As Integer = 0 + 'SyncLock ArgumentsQueueLock + ' nQueueArgs = m_ArgumentsQueue.Count + 'End SyncLock + 'If nQueueArgs = 0 Then + ' Dim bProcessWaiting As Boolean = False + ' For Each ThreadData In m_ThreadDataList + ' Dim CurrThreadData = ThreadData + ' If Not IsNothing(CurrThreadData) OrElse CurrThreadData.ProcessStatus = ThreadData.ProcessStatuses.WAITINGANSWER OrElse CurrThreadData.ProcessStatus = ThreadData.ProcessStatuses.ANSWERRECEIVED Then + ' bProcessWaiting = True + ' Exit For + ' End If + ' Next + ' If Not bProcessWaiting Then + ' ' creo thread per lanciare evento asincrono di fine calcolo + ' Dim AllArgsProcessedThread = New Thread(Sub() + ' RaiseEvent m_AllArgsProcessed() + ' End Sub) + ' AllArgsProcessedThread.SetApartmentState(ApartmentState.STA) + ' AllArgsProcessedThread.Start() + ' End If + 'End If If Not m_bFirstStatistics Then m_bFirstStatistics = True RaiseEvent m_Statistics(New Statistics(nRunningProcesses, nCalculatingProcesses, 0, 0, 0, 0)) @@ -404,13 +416,16 @@ Public Class ExecProcessManager Dim ProcInfo As New ProcessStartInfo(m_sProcessFileName, m_nGroupId.ToString() & ThreadIndex.ToString() & " " & m_sProcessArguments) ProcInfo.RedirectStandardInput = True ProcInfo.RedirectStandardOutput = True + ProcInfo.RedirectStandardError = True ProcInfo.UseShellExecute = False ProcInfo.CreateNoWindow = True Dim Proc = Process.Start(ProcInfo) AddHandler Proc.OutputDataReceived, AddressOf Thread_OutputDataReceived + AddHandler Proc.ErrorDataReceived, AddressOf Thread_ErrorDataReceived If Not (Proc Is Nothing) Then Proc.BeginOutputReadLine() + Proc.BeginErrorReadLine() MyThreadData.SetProcess(Proc) MyThreadData.SetProcessStatus(ThreadData.ProcessStatuses.NULL) ' ciclo per leggere coda ed eseguire @@ -430,6 +445,7 @@ Public Class ExecProcessManager MyThreadData.SetCurrRequest(NextProcessArgs) NextProcessArgs.SetThreadIndex(ThreadIndex) Proc.StandardInput.WriteLine("#8477271#" & NextProcessArgs.sProcessArgs & "#8477271#") + Proc.StandardInput.Flush() MyThreadData.SetProcessStatus(ThreadData.ProcessStatuses.WAITINGANSWER) End If Case ThreadData.ProcessStatuses.WAITINGANSWER @@ -451,6 +467,7 @@ Public Class ExecProcessManager End While If m_bStopProcess Then Proc.StandardInput.WriteLine("quit") + Proc.StandardInput.Flush() End If End If MyThreadData.SetProcess(Nothing) @@ -463,9 +480,15 @@ Public Class ExecProcessManager Dim Result As AnswerDTO = JsonConvert.DeserializeObject(Of AnswerDTO)(sResult) m_ThreadDataList(Result.nThreadIndex).SetProcResult(Result) m_ThreadDataList(Result.nThreadIndex).SetProcessStatus(ThreadData.ProcessStatuses.ANSWERRECEIVED) + Else + EgtOutLog("Riga su StandardOutput non riconosciuta " & e.Data) End If End Sub + Private Sub Thread_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) + EgtOutLog("Errore su StandardError! " & e.Data) + End Sub + Protected Overridable Sub Dispose(disposing As Boolean) If Not disposedValue Then If disposing Then diff --git a/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb index 7f0e4c3..a5e6d89 100644 --- a/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb +++ b/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb @@ -28,5 +28,5 @@ Imports System.Runtime.InteropServices ' Revision ' - - + + diff --git a/EgwMultiEngineManager.Data/EgwMultiEngineManager.Data.vbproj b/EgwMultiEngineManager.Data/EgwMultiEngineManager.Data.vbproj index 3203f91..4294851 100644 --- a/EgwMultiEngineManager.Data/EgwMultiEngineManager.Data.vbproj +++ b/EgwMultiEngineManager.Data/EgwMultiEngineManager.Data.vbproj @@ -5,10 +5,10 @@ netstandard2.0 My Project\app.manifest Copyright © 2020-2025 by Egalware s.r.l. - 2.7.10.1 - 2.7.10.1 + 2.7.11.1 + 2.7.11.1 Egalware s.r.l. - 2.7.10.1 + 2.7.11.1 Emmanuele Sassi Specifiche comunicazione con EgwMultiEngineManager diff --git a/EgwMultiEngineManager.Data/QuestionDTO.vb b/EgwMultiEngineManager.Data/QuestionDTO.vb index e277b04..e093ea9 100644 --- a/EgwMultiEngineManager.Data/QuestionDTO.vb +++ b/EgwMultiEngineManager.Data/QuestionDTO.vb @@ -18,6 +18,9 @@ Public Class QuestionDTO Return m_nId End Get End Property + Public Sub SetId(nId As Integer) + m_nId = nId + End Sub Private m_ExecEnvironment As EXECENVIRONMENTS Public ReadOnly Property ExecEnvironment As EXECENVIRONMENTS diff --git a/EgwMultiEngineManager.Tray/Constants/ConstGen.vb b/EgwMultiEngineManager.Tray/Constants/ConstGen.vb index add5750..a771133 100644 --- a/EgwMultiEngineManager.Tray/Constants/ConstGen.vb +++ b/EgwMultiEngineManager.Tray/Constants/ConstGen.vb @@ -19,7 +19,7 @@ Public Module ConstGen Public Const K_DATAROOT As String = "DataRoot" ' File di log generale - Public Const GENLOG_FILE_NAME As String = "EgwMultiEngineManagerLog#.txt" + Public Const GENLOG_FILE_NAME As String = "EgwMultiEngineManager.TrayLog#.txt" ' Sottodirettorio di configurazione Public Const CONF_DIR As String = "Config" diff --git a/EgwMultiEngineManager.Tray/Constants/ConstIni.vb b/EgwMultiEngineManager.Tray/Constants/ConstIni.vb index 525bb0c..4c2631a 100644 --- a/EgwMultiEngineManager.Tray/Constants/ConstIni.vb +++ b/EgwMultiEngineManager.Tray/Constants/ConstIni.vb @@ -12,7 +12,7 @@ '---------------------------------------------------------------------------- Module ConstIni - Public Const INI_FILE_NAME As String = "EgwMultiEngineManagerTray.ini" + Public Const INI_FILE_NAME As String = "EgwMultiEngineManager.Tray.ini" Public Const S_GENERAL As String = "General" Public Const K_CAMEXEPATH As String = "CAMExePath" diff --git a/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj b/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj index fa86475..2c45a22 100644 --- a/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj +++ b/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj @@ -66,8 +66,8 @@ true - - ..\..\..\EgtProg\DllD32\EgtDotNETBasis.dll + + ..\packages\EgtDotNETBasis.2.7.11.20\lib\EgtDotNETBasis.dll ..\..\EgwWPFBaseLib\EgwWPFBaseLib\bin\Debug\EgwWPFBaseLib.dll @@ -230,8 +230,10 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 $(ConfigurationName) $(TargetDir) + \ No newline at end of file diff --git a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb index 38e46ce..c496893 100644 --- a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb +++ b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb @@ -127,6 +127,9 @@ Public Class MainWindowVM RaiseEvent QuitApplication() Return End If + ' imposto log per ExecProcessManager + ExecProcessManager.SetEgtOutLog(AddressOf EgtOutLog) + ' carico ambienti Dim nGroupIndex As Integer = 1 Dim sEnvironment As String = "" Dim sPipeLuaFile As String = "" diff --git a/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb index b6adc10..68ee3f9 100644 --- a/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb +++ b/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb @@ -52,5 +52,5 @@ Imports System.Windows ' Revision ' - - + + diff --git a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb index bcc1568..d680a24 100644 --- a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb +++ b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb @@ -19,6 +19,14 @@ Public Class ExecEnvironmentManager Private disposedValue As Boolean + Private m_nRequestCounter As Integer = 0 + Private ReadOnly Property nRequestCounter As Integer + Get + m_nRequestCounter += 1 + Return m_nRequestCounter + End Get + End Property + Private m_ExecEnvironment As EXECENVIRONMENTS = EXECENVIRONMENTS.NULL Friend ReadOnly Property ExecEnvironment As EXECENVIRONMENTS Get @@ -98,8 +106,9 @@ Public Class ExecEnvironmentManager Private Sub EgwEngineInputHandler(RedisChannel As RedisChannel, RedisValue As RedisValue) m_stopWatch.Restart() Dim Request As QuestionDTO = JsonConvert.DeserializeObject(Of QuestionDTO)(RedisValue) - EgtOutLog(DateTime.Now.ToString("HH:mm:ss.fff") & " Environment=" & m_ExecEnvironment & " Channel=" & RedisChannel.ToString() & " Question Id=" & Request.nId) If Request.ExecEnvironment = m_ExecEnvironment Then + Request.SetId(nRequestCounter) + EgtOutLog(DateTime.Now.ToString("HH:mm:ss.fff") & " Environment=" & m_ExecEnvironment & " Channel=" & RedisChannel.ToString() & " Question Id=" & Request.nId) m_ExecProcessManager.ArgumentsEnqueue(Request) End If End Sub diff --git a/EgwMultiEngineManager.Tray/packages.config b/EgwMultiEngineManager.Tray/packages.config index fb0e236..8a5c602 100644 --- a/EgwMultiEngineManager.Tray/packages.config +++ b/EgwMultiEngineManager.Tray/packages.config @@ -1,5 +1,6 @@  + diff --git a/EgwMultiEngineManager.Tray/post-build.ps1 b/EgwMultiEngineManager.Tray/post-build.ps1 index 84a36e0..fd932bb 100644 --- a/EgwMultiEngineManager.Tray/post-build.ps1 +++ b/EgwMultiEngineManager.Tray/post-build.ps1 @@ -8,8 +8,8 @@ Write-Host "Inizio processing After Build: configurazione $config , directory $d switch ($config) { "Release" { Write-Host "Release processing..." - Get-ChildItem -Path "$directory" -Recurse -Include *.pdb, *.xml | Remove-Item -Force - Get-ChildItem -Path "$directory\lib" -Recurse -Include *.pdb | Remove-Item -Force + #Get-ChildItem -Path "$directory" -Recurse -Include *.pdb, *.xml | Remove-Item -Force + #Get-ChildItem -Path "$directory\lib" -Recurse -Include *.pdb | Remove-Item -Force Write-Host "Release: eliminato pdb + xml!!!" } "Debug" { @@ -17,7 +17,10 @@ switch ($config) { } "RemoteDebug" { Write-Host "RemoteDebug processing, effettuo copia script verso server remoto (ROBOCOPY)" - + + # copio DataRoot + $datarootdest = Join-Path $directory "DataRoot.ini" + Copy-Item "c:\EgtDev\EgwMultiEngineManager\ExtData\Tray.DataRoot.ini" $datarootdest -Force # Uncomment the appropriate ROBOCOPY line(s) as needed # Write-Host "Debug remoto: effettuo robocopy sync (verificare remote per cliente)" ROBOCOPY "$directory" "\\w11-calc-01\c$\EgtProg\EgwMultiEngineManager" /MIR diff --git a/ExtData/Tray.DataRoot.ini b/ExtData/Tray.DataRoot.ini new file mode 100644 index 0000000..db2b4f2 --- /dev/null +++ b/ExtData/Tray.DataRoot.ini @@ -0,0 +1,3 @@ +; Commento per evitare BOM con UTF-8 +[Data] +DataRoot=C:\EgtData\EgwMultiEngineManager.Tray