From b4d4eddccd49efa6c12253808b7bd5ca877e8154 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Wed, 1 Oct 2025 16:00:57 +0200 Subject: [PATCH 1/3] - sviluppo statistiche per environment in tooltip --- .../Application.xaml.vb | 95 +++++++++++++------ .../MainWindow/MainWindowVM.vb | 58 ++++++++--- .../Utility/EnvironmentManager.vb | 4 +- 3 files changed, 112 insertions(+), 45 deletions(-) diff --git a/EgwMultiEngineManager.Tray/Application.xaml.vb b/EgwMultiEngineManager.Tray/Application.xaml.vb index 91bfcc5..c6b3c0b 100644 --- a/EgwMultiEngineManager.Tray/Application.xaml.vb +++ b/EgwMultiEngineManager.Tray/Application.xaml.vb @@ -1,5 +1,6 @@ Imports System.Drawing Imports System.Windows.Forms +Imports System.Windows.Threading Imports EgwMultiEngineManager.Data Class Application @@ -11,8 +12,7 @@ Class Application Private m_bIsShuttingDown As Boolean = False Private m_NotifyIcon As NotifyIcon - Private m_WindowStatistics As Statistics - Private m_AedificaStatistics As Statistics + Private m_StatisticsTimer As New DispatcherTimer Protected Overrides Sub OnStartup(e As StartupEventArgs) MyBase.OnStartup(e) @@ -20,8 +20,6 @@ Class Application ' creo Vm e quindi avvio processi m_MainWindowVM = New MainWindowVM AddHandler m_MainWindowVM.QuitApplication, AddressOf MainWindowVM_QuitApplication - AddHandler m_MainWindowVM.WindowStatisticUpdate, AddressOf MainWindowVM_WindowStatisticUpdate - AddHandler m_MainWindowVM.AedificaStatisticUpdate, AddressOf MainWindowVM_AedificaStatisticUpdate ' creo icona di notifica nella tray m_NotifyIcon = New NotifyIcon m_NotifyIcon.Visible = True @@ -39,6 +37,11 @@ Class Application ContextMenu.MenuItems.Add(QuitBtn) m_NotifyIcon.ContextMenu = ContextMenu AddHandler m_NotifyIcon.Click, AddressOf NotifyIcon_Click + ' inizializzo timer statistiche + m_StatisticsTimer.Interval = New TimeSpan(0, 0, 10) + AddHandler m_StatisticsTimer.Tick, AddressOf StatisticsTimer_Tick + StatisticsTimer_Tick() + m_StatisticsTimer.Start() End Sub Sub NotifyIcon_Click(sender As Object, e As EventArgs) @@ -108,34 +111,64 @@ Class Application Application.Current.Shutdown() End Sub - Private Sub MainWindowVM_WindowStatisticUpdate(e As Statistics) - Dim Tooltip As String = "QRun " & e.nEngineRunningQty & Environment.NewLine & - "QProc " & e.nEngineProcessingQty & Environment.NewLine & - "MidT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & - "Que " & e.nQuestionInQueue & Environment.NewLine & - "1MAns " & e.nLastMinAnswer & Environment.NewLine & - "5MAns " & e.nLast5MinAnswer & Environment.NewLine & - "HAns " & e.nLastHourAnswer - '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & - '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & - Tooltip = Tooltip.Substring(0, Math.Min(60, Tooltip.Length)) - m_WindowStatistics = e - m_NotifyIcon.Text = Tooltip + Private Sub StatisticsTimer_Tick() + If True Then + Dim sEnvironment As String = "" + GetMainPrivateProfileString(S_EXECGROUP & 1.ToString(), K_ENVIRONMENT, "", sEnvironment) + Dim ExecEnvironment As EXECENVIRONMENTS = m_MainWindowVM.GetExecEnvironmentFromString(sEnvironment) + If ExecEnvironment <> EXECENVIRONMENTS.NULL Then + Dim CurrStatistics As Statistics = m_MainWindowVM.GetValueFromKeyInStatisticsList(ExecEnvironment) + If Not IsNothing(CurrStatistics) Then + Dim Tooltip As String = "QRun " & CurrStatistics.nEngineRunningQty & Environment.NewLine & + "QProc " & CurrStatistics.nEngineProcessingQty & Environment.NewLine & + "MidT " & CurrStatistics.dMidProcessingTime.ToString("N1") & Environment.NewLine & + "Que " & CurrStatistics.nQuestionInQueue & Environment.NewLine & + "1MAns " & CurrStatistics.nLastMinAnswer & Environment.NewLine & + "5MAns " & CurrStatistics.nLast5MinAnswer & Environment.NewLine & + "HAns " & CurrStatistics.nLastHourAnswer + '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & + '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & + Tooltip = Tooltip.Substring(0, Math.Min(60, Tooltip.Length)) + m_NotifyIcon.Text = Tooltip + End If + End If + Else + Dim KeyList As List(Of EXECENVIRONMENTS) = m_MainWindowVM.GetStatisticsListKeyCollection() + Dim StatisticsList As New List(Of Statistics) + Dim sQRun As String = "QRun__" + Dim sQProc As String = "QProc_" + Dim sMidT As String = "MidT__" + Dim sQue As String = "Que___" + Dim s1MAns As String = "1MAns_" + Dim s5MAns As String = "5MAns_" + Dim sHAns As String = "HAns__" + For Each Key In KeyList + Dim KeyStatistics As Statistics = m_MainWindowVM.GetValueFromKeyInStatisticsList(Key) + sQRun &= KeyStatistics.nEngineRunningQty.ToString("00000") & " " + sQProc &= KeyStatistics.nEngineProcessingQty.ToString("00000") & " " + sMidT &= Math.Ceiling(KeyStatistics.dMidProcessingTime).ToString("00000") & " " + sQue &= KeyStatistics.nQuestionInQueue.ToString("00000") & " " + s1MAns &= KeyStatistics.nLastMinAnswer.ToString("00000") & " " + s5MAns &= KeyStatistics.nLast5MinAnswer.ToString("00000") & " " + sHAns &= KeyStatistics.nLastHourAnswer.ToString("00000") & " " + Next + Dim Tooltip As String = sQRun & Environment.NewLine & + sQProc & Environment.NewLine & + sMidT & Environment.NewLine & + sQue & Environment.NewLine & + s1MAns & Environment.NewLine & + s5MAns & Environment.NewLine & + sHAns + '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & + '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & + 'Tooltip = Tooltip.Substring(0, Math.Min(60, Tooltip.Length)) + 'm_NotifyIcon.Text = Tooltip + m_NotifyIcon.BalloonTipTitle = "EgwMultiEngineManager" + m_NotifyIcon.BalloonTipIcon = ToolTipIcon.Info + m_NotifyIcon.BalloonTipText = Tooltip + m_NotifyIcon.ShowBalloonTip(5000) + End If End Sub - Private Sub MainWindowVM_AedificaStatisticUpdate(e As Statistics) - Dim Tooltip As String = "QRun " & e.nEngineRunningQty & Environment.NewLine & - "QProc " & e.nEngineProcessingQty & Environment.NewLine & - "MidT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & - "Que " & e.nQuestionInQueue & Environment.NewLine & - "1MAns " & e.nLastMinAnswer & Environment.NewLine & - "5MAns " & e.nLast5MinAnswer & Environment.NewLine & - "HAns " & e.nLastHourAnswer - '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & - '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & - Tooltip = Tooltip.Substring(0, Math.Min(60, Tooltip.Length)) - m_AedificaStatistics = e - m_NotifyIcon.Text = Tooltip - End Sub End Class diff --git a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb index 6b862f9..04c3d7c 100644 --- a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb +++ b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb @@ -7,8 +7,6 @@ Public Class MainWindowVM Inherits VMBase Public Event QuitApplication() - Public Event WindowStatisticUpdate(Statistics As Statistics) - Public Event AedificaStatisticUpdate(Statistics As Statistics) Private Const m_TitleMsg As String = "EgwMultiEngineManager" @@ -33,6 +31,32 @@ Public Class MainWindowVM End Get End Property + Private m_Lock_StatisticsList As New Object + Private m_StatisticsList As New Dictionary(Of EXECENVIRONMENTS, Statistics) + Friend Function GetValueFromKeyInStatisticsList(ExecEnvironment As EXECENVIRONMENTS) As Statistics + SyncLock m_Lock_StatisticsList + If m_StatisticsList.ContainsKey(ExecEnvironment) Then + Return m_StatisticsList(ExecEnvironment) + Else + Return Nothing + End If + End SyncLock + End Function + Friend Sub SetValueToKeyInStatisticsList(ExecEnvironment As EXECENVIRONMENTS, Statistics As Statistics) + SyncLock m_Lock_StatisticsList + If m_StatisticsList.ContainsKey(ExecEnvironment) Then + m_StatisticsList(ExecEnvironment) = Statistics + Else + m_StatisticsList.Add(ExecEnvironment, Statistics) + End If + End SyncLock + End Sub + Friend Function GetStatisticsListKeyCollection() As List(Of EXECENVIRONMENTS) + SyncLock m_Lock_StatisticsList + Return m_StatisticsList.Keys.ToList() + End SyncLock + End Function + Private m_ExecEnvironmentList As New Dictionary(Of EXECENVIRONMENTS, ExecEnvironmentManager) Public ReadOnly Property ExecEnvironmentList As Dictionary(Of EXECENVIRONMENTS, ExecEnvironmentManager) Get @@ -114,17 +138,7 @@ Public Class MainWindowVM nGroupIndex += 1 Continue While End If - Dim ExecEnvironment As EXECENVIRONMENTS = EXECENVIRONMENTS.NULL - Select Case sEnvironment - Case "WINDOW" - ExecEnvironment = EXECENVIRONMENTS.WINDOW - Case "BEAM" - ExecEnvironment = EXECENVIRONMENTS.BEAM - Case "WALL" - ExecEnvironment = EXECENVIRONMENTS.WALL - Case "CABINET" - ExecEnvironment = EXECENVIRONMENTS.CABINET - End Select + Dim ExecEnvironment As EXECENVIRONMENTS = GetExecEnvironmentFromString(sEnvironment) If ExecEnvironment = EXECENVIRONMENTS.NULL Then System.Console.WriteLine(String.Format("No ExecEnvironment assigned!" & Environment.NewLine & " Group{0} will not be created!", nGroupIndex.ToString())) nGroupIndex += 1 @@ -146,10 +160,28 @@ Public Class MainWindowVM bDebug = (nDebug = 1) Dim NewExecProcessManager As New ExecEnvironmentManager(ExecEnvironment, nGroupIndex, sCamExePath, sProcessArguments, nMaxCamInstances, ExecProcessManager.ReturnModes.EVENT_, bDebug) m_ExecEnvironmentList.Add(ExecEnvironment, NewExecProcessManager) + AddHandler NewExecProcessManager.StatisticUpdate, AddressOf NewExecProcessManager_StatisticUpdate nGroupIndex += 1 End While End Sub + Friend Function GetExecEnvironmentFromString(sEnvironment As String) As EXECENVIRONMENTS + Select Case sEnvironment + Case "WINDOW" + Return EXECENVIRONMENTS.WINDOW + Case "BEAM" + Return EXECENVIRONMENTS.BEAM + Case "WALL" + Return EXECENVIRONMENTS.WALL + Case "CABINET" + Return EXECENVIRONMENTS.CABINET + Case Else + Return EXECENVIRONMENTS.NULL + End Select + End Function + Private Sub NewExecProcessManager_StatisticUpdate(ExecEnvironment As EXECENVIRONMENTS, Statistics As Statistics) + SetValueToKeyInStatisticsList(ExecEnvironment, Statistics) + End Sub Public Sub Quit() For Each Key In m_ExecEnvironmentList.Keys diff --git a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb index 5c8484b..5e976f6 100644 --- a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb +++ b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb @@ -7,6 +7,8 @@ Imports StackExchange.Redis Public Class ExecEnvironmentManager Implements IDisposable + Public Event StatisticUpdate(Environment As EXECENVIRONMENTS, Statistics As Statistics) + Private ConstChnName_EgwEngineInput As String = "EgwEngineInput" Private ConstChnName_EgwEngineOutput As String = "EgwEngineOutput" Private ConstChnName_EgwStatistics As String = "EgwStatistics" @@ -130,7 +132,7 @@ Public Class ExecEnvironmentManager Private Sub ExecProcessManager_Statistics(e As Statistics) Dim CurrManagerStatistics As Statistics = e CurrManagerStatistics.SetProcessingTimes(m_dMinProcessingTime, m_dMidProcessingTime, m_dMaxProcessingTime) - 'RaiseEvent WindowStatisticUpdate(CurrManagerStatistics) + RaiseEvent StatisticUpdate(m_ExecEnvironment, CurrManagerStatistics) m_RedisManager.Subscriber.Publish(m_chnEgwStatistics, JsonConvert.SerializeObject(CurrManagerStatistics)) m_nProcessingQty = 0 m_dMinProcessingTime = 100000 From da5bb6f05baec352567434b028e3ccfa83093fde Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Mon, 12 Jan 2026 10:05:37 +0100 Subject: [PATCH 2/3] EgwMultiEngineManager 3.1.1.1: - aggiunta funzione Copy a Statistics - aggiunta gestione statistiche - aggiunta gestione eccezioni su subscribe e publish del Redis --- .../My Project/AssemblyInfo.vb | 4 +- .../EgwMultiEngineManager.Data.vbproj | 6 +- EgwMultiEngineManager.Data/Statistics.vb | 16 ++++ .../Application.xaml.vb | 49 +++++++++++- .../MainWindow/MainWindowVM.vb | 24 +++--- .../My Project/AssemblyInfo.vb | 4 +- .../Utility/EnvironmentManager.vb | 74 ++++++++++++------- .../Utility/RedisManager.vb | 25 +++++-- 8 files changed, 151 insertions(+), 51 deletions(-) diff --git a/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb index ffb51ba..ac9375b 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 8760984..91a0adf 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.12.1 - 2.7.12.1 + 3.1.1.1 + 3.1.1.1 Egalware s.r.l. - 2.7.12.1 + 3.1.1.1 Emmanuele Sassi Specifiche comunicazione con EgwMultiEngineManager diff --git a/EgwMultiEngineManager.Data/Statistics.vb b/EgwMultiEngineManager.Data/Statistics.vb index b079b41..1636e93 100644 --- a/EgwMultiEngineManager.Data/Statistics.vb +++ b/EgwMultiEngineManager.Data/Statistics.vb @@ -72,10 +72,26 @@ m_nQuestionInQueue = nQuestionInQueue End Sub + Sub New(Statistics As Statistics) + m_nEngineRunningQty = Statistics.nEngineRunningQty + m_nEngineProcessingQty = Statistics.nEngineProcessingQty + m_dMinProcessingTime = Statistics.dMinProcessingTime + m_dMidProcessingTime = Statistics.dMidProcessingTime + m_dMaxProcessingTime = Statistics.dMaxProcessingTime + m_nLastMinAnswer = Statistics.nLastMinAnswer + m_nLast5MinAnswer = Statistics.nLast5MinAnswer + m_nLastHourAnswer = Statistics.nLastHourAnswer + m_nQuestionInQueue = Statistics.nQuestionInQueue + End Sub + Public Sub SetProcessingTimes(dMinProcessingTime As Double, dMidProcessingTime As Double, dMaxProcessingTime As Double) m_dMinProcessingTime = dMinProcessingTime m_dMidProcessingTime = dMidProcessingTime m_dMaxProcessingTime = dMaxProcessingTime End Sub + Public Function Copy() As Statistics + Return New Statistics(Me) + End Function + End Class \ No newline at end of file diff --git a/EgwMultiEngineManager.Tray/Application.xaml.vb b/EgwMultiEngineManager.Tray/Application.xaml.vb index ca8247e..90b54cb 100644 --- a/EgwMultiEngineManager.Tray/Application.xaml.vb +++ b/EgwMultiEngineManager.Tray/Application.xaml.vb @@ -2,6 +2,7 @@ Imports System.Windows.Forms Imports System.Windows.Threading Imports EgwMultiEngineManager.Data +Imports EgwMultiEngineManager.Tray.ExecEnvironmentManager Class Application @@ -113,9 +114,53 @@ Class Application Private Sub StatisticsTimer_Tick() If True Then + Dim sTooltip As String = "RPTQ15H" & Environment.NewLine + Dim sEnvironment As String = "" + For nGroupType = EnvironmentCommunicationTypes.REDIS To EnvironmentCommunicationTypes.REST + Dim nGroupIndex As Integer = 1 + Dim sGroupName As String = If(nGroupType = EnvironmentCommunicationTypes.REST, S_RESTEXECGROUP, S_EXECGROUP) & nGroupIndex.ToString() + While GetMainPrivateProfileString(sGroupName, K_ENVIRONMENT, "", sEnvironment) > 0 + Dim CurrStatistics As Statistics = m_MainWindowVM.GetValueFromKeyInStatisticsList(sGroupName) + If Not IsNothing(CurrStatistics) Then + sTooltip &= If(nGroupType = EnvironmentCommunicationTypes.REST, "R", "G") & nGroupIndex.ToString() & + CurrStatistics.nEngineRunningQty & + CurrStatistics.nEngineProcessingQty & + CurrStatistics.dMidProcessingTime.ToString("N1") & + CurrStatistics.nQuestionInQueue & + CurrStatistics.nLastMinAnswer & + CurrStatistics.nLast5MinAnswer & + CurrStatistics.nLastHourAnswer & Environment.NewLine + '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & + '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & + End If + nGroupIndex += 1 + sGroupName = If(nGroupType = EnvironmentCommunicationTypes.REST, S_RESTEXECGROUP, S_EXECGROUP) & nGroupIndex.ToString() + End While + Next + sTooltip = sTooltip.Substring(0, Math.Min(60, sTooltip.Length)) + m_NotifyIcon.Text = sTooltip + Return + Dim ExecEnvironment As EXECENVIRONMENTS = ExecEnvironmentManager.GetExecEnvironmentFromString(sEnvironment) + If ExecEnvironment <> EXECENVIRONMENTS.NULL Then + Dim CurrStatistics As Statistics = m_MainWindowVM.GetValueFromKeyInStatisticsList(ExecEnvironment) + If Not IsNothing(CurrStatistics) Then + Dim Tooltip As String = "QRun " & CurrStatistics.nEngineRunningQty & Environment.NewLine & + "QProc " & CurrStatistics.nEngineProcessingQty & Environment.NewLine & + "MidT " & CurrStatistics.dMidProcessingTime.ToString("N1") & Environment.NewLine & + "Que " & CurrStatistics.nQuestionInQueue & Environment.NewLine & + "1MAns " & CurrStatistics.nLastMinAnswer & Environment.NewLine & + "5MAns " & CurrStatistics.nLast5MinAnswer & Environment.NewLine & + "HAns " & CurrStatistics.nLastHourAnswer + '"MinT " & e.dMinProcessingTime.ToString("N1") & Environment.NewLine & + '"MaxT " & e.nQuestionInQueue.ToString("N1") & Environment.NewLine & + Tooltip = Tooltip.Substring(0, Math.Min(60, Tooltip.Length)) + m_NotifyIcon.Text = Tooltip + End If + End If + ElseIf False Then Dim sEnvironment As String = "" GetMainPrivateProfileString(S_EXECGROUP & 1.ToString(), K_ENVIRONMENT, "", sEnvironment) - Dim ExecEnvironment As EXECENVIRONMENTS = m_MainWindowVM.GetExecEnvironmentFromString(sEnvironment) + Dim ExecEnvironment As EXECENVIRONMENTS = ExecEnvironmentManager.GetExecEnvironmentFromString(sEnvironment) If ExecEnvironment <> EXECENVIRONMENTS.NULL Then Dim CurrStatistics As Statistics = m_MainWindowVM.GetValueFromKeyInStatisticsList(ExecEnvironment) If Not IsNothing(CurrStatistics) Then @@ -133,7 +178,7 @@ Class Application End If End If Else - Dim KeyList As List(Of EXECENVIRONMENTS) = m_MainWindowVM.GetStatisticsListKeyCollection() + Dim KeyList As List(Of String) = m_MainWindowVM.GetStatisticsListKeyCollection() Dim StatisticsList As New List(Of Statistics) Dim sQRun As String = "QRun__" Dim sQProc As String = "QProc_" diff --git a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb index 68b93b7..9b1a361 100644 --- a/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb +++ b/EgwMultiEngineManager.Tray/MainWindow/MainWindowVM.vb @@ -48,26 +48,26 @@ Public Class MainWindowVM End Property Private m_Lock_StatisticsList As New Object - Private m_StatisticsList As New Dictionary(Of EXECENVIRONMENTS, Statistics) - Friend Function GetValueFromKeyInStatisticsList(ExecEnvironment As EXECENVIRONMENTS) As Statistics + Private m_StatisticsList As New Dictionary(Of String, Statistics) + Friend Function GetValueFromKeyInStatisticsList(sGroupName As String) As Statistics SyncLock m_Lock_StatisticsList - If m_StatisticsList.ContainsKey(ExecEnvironment) Then - Return m_StatisticsList(ExecEnvironment) + If m_StatisticsList.ContainsKey(sGroupName) Then + Return m_StatisticsList(sGroupName).Copy() Else Return Nothing End If End SyncLock End Function - Friend Sub SetValueToKeyInStatisticsList(ExecEnvironment As EXECENVIRONMENTS, Statistics As Statistics) + Friend Sub SetValueToKeyInStatisticsList(sGroupName As String, Statistics As Statistics) SyncLock m_Lock_StatisticsList - If m_StatisticsList.ContainsKey(ExecEnvironment) Then - m_StatisticsList(ExecEnvironment) = Statistics + If m_StatisticsList.ContainsKey(sGroupName) Then + m_StatisticsList(sGroupName) = Statistics Else - m_StatisticsList.Add(ExecEnvironment, Statistics) + m_StatisticsList.Add(sGroupName, Statistics) End If End SyncLock End Sub - Friend Function GetStatisticsListKeyCollection() As List(Of EXECENVIRONMENTS) + Friend Function GetStatisticsListKeyCollection() As List(Of String) SyncLock m_Lock_StatisticsList Return m_StatisticsList.Keys.ToList() End SyncLock @@ -164,6 +164,7 @@ Public Class MainWindowVM While ExecEnvironmentManager.CreateExecEnvironmentManager(ExecEnvironmentManager.EnvironmentCommunicationTypes.REDIS, nGroupIndex, NewExecProcessManager) If Not IsNothing(NewExecProcessManager) Then m_ExecEnvironmentList.Add(NewExecProcessManager) + AddHandler NewExecProcessManager.StatisticUpdate, AddressOf NewExecProcessManager_StatisticUpdate End If NewExecProcessManager = Nothing nGroupIndex += 1 @@ -174,6 +175,7 @@ Public Class MainWindowVM While ExecEnvironmentManager.CreateExecEnvironmentManager(ExecEnvironmentManager.EnvironmentCommunicationTypes.REST, nGroupIndex, NewExecProcessManager) If Not IsNothing(NewExecProcessManager) Then m_ExecEnvironmentList.Add(NewExecProcessManager) + AddHandler NewExecProcessManager.StatisticUpdate, AddressOf NewExecProcessManager_StatisticUpdate End If NewExecProcessManager = Nothing nGroupIndex += 1 @@ -181,6 +183,10 @@ Public Class MainWindowVM End Sub + Private Sub NewExecProcessManager_StatisticUpdate(sGroupName As String, Statistics As Statistics) + SetValueToKeyInStatisticsList(sGroupName, Statistics) + End Sub + Private Sub ManageInstance() Dim bCreated As Boolean Try diff --git a/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb index 5a85b90..76383d9 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 60912bd..807008f 100644 --- a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb +++ b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb @@ -19,7 +19,7 @@ Public Class ExecEnvironmentManager REST = 2 End Enum - Public Event StatisticUpdate(Environment As EXECENVIRONMENTS, Statistics As Statistics) + Public Event StatisticUpdate(sGroupName As String, Statistics As Statistics) Private ConstChnName_EgwEngineInput As String = "EgwEngineInput" Private ConstChnName_EgwEngineOutput As String = "EgwEngineOutput" @@ -56,6 +56,13 @@ Public Class ExecEnvironmentManager End Get End Property + Private m_sGroupName As String = String.Empty + Friend ReadOnly Property GroupName As String + Get + Return m_sGroupName + End Get + End Property + Private Shared m_RedisManager As RedisManager Friend Shared Sub SetRedisManager(RedisManager As RedisManager) m_RedisManager = RedisManager @@ -96,6 +103,7 @@ Public Class ExecEnvironmentManager End Property Private m_chnEgwEngineOutput As RedisChannel + Private m_chnEgwEngineInput As RedisChannel Private m_chnEgwStatistics As RedisChannel ' statistics @@ -116,58 +124,49 @@ Public Class ExecEnvironmentManager Dim sPipeLuaFile As String = "" Dim nMaxCamInstances As Integer = 0 Dim bDebug As Boolean = False - Dim sGroupTitle As String = If(nType = EnvironmentCommunicationTypes.REST, S_RESTEXECGROUP, S_EXECGROUP) - If GetMainPrivateProfileString(sGroupTitle & nGroupIndex.ToString(), K_ENVIRONMENT, "", sEnvironment) > 0 AndAlso - GetMainPrivateProfileString(sGroupTitle & nGroupIndex.ToString(), K_PIPELUAFILE, "", sPipeLuaFile) AndAlso - GetMainPrivateProfileString(sGroupTitle & nGroupIndex.ToString(), K_MAXCAMINSTANCES, "", nMaxCamInstances) Then + Dim sGroupName As String = If(nType = EnvironmentCommunicationTypes.REST, S_RESTEXECGROUP, S_EXECGROUP) & nGroupIndex.ToString() + If GetMainPrivateProfileString(sGroupName, K_ENVIRONMENT, "", sEnvironment) > 0 AndAlso + GetMainPrivateProfileString(sGroupName, K_PIPELUAFILE, "", sPipeLuaFile) AndAlso + GetMainPrivateProfileString(sGroupName, K_MAXCAMINSTANCES, "", nMaxCamInstances) Then EgtOutLog(If(nType = EnvironmentCommunicationTypes.REST, "REST", "") & "Group" & nGroupIndex.ToString()) EgtOutLog("Environment = " & sEnvironment) EgtOutLog("PipeLuaFile = " & sPipeLuaFile) EgtOutLog("MaxCAMInstances = " & nMaxCamInstances) If nMaxCamInstances <= 0 Then EgtOutLog("No Cam instances assigned!") - EgtOutLog(String.Format(sGroupTitle & "{0} will not be created!", nGroupIndex.ToString())) + EgtOutLog(String.Format(sGroupName & " will not be created!")) nGroupIndex += 1 Return True End If - Dim ExecEnvironment As EXECENVIRONMENTS = EXECENVIRONMENTS.NULL - Select Case sEnvironment - Case "WINDOW" - ExecEnvironment = EXECENVIRONMENTS.WINDOW - Case "BEAM" - ExecEnvironment = EXECENVIRONMENTS.BEAM - Case "WALL" - ExecEnvironment = EXECENVIRONMENTS.WALL - Case "CABINET" - ExecEnvironment = EXECENVIRONMENTS.CABINET - End Select + Dim ExecEnvironment As EXECENVIRONMENTS = GetExecEnvironmentFromString(sEnvironment) If ExecEnvironment = EXECENVIRONMENTS.NULL Then EgtOutLog("No ExecEnvironment assigned!") - EgtOutLog(String.Format(sGroupTitle & "{0} will not be created!", nGroupIndex.ToString())) + EgtOutLog(String.Format(sGroupName & " will not be created!")) nGroupIndex += 1 Return True End If Dim sPipeLuaPath As String = Map.refMainWindowVM.sDataRoot & "\" & sPipeLuaDirName & "\" & sPipeLuaFile If Not File.Exists(sPipeLuaPath) Then EgtOutLog("Lua file not assigned or not found!") - EgtOutLog(String.Format(sGroupTitle & "{0} will not be created!", nGroupIndex.ToString())) + EgtOutLog(String.Format(sGroupName & " will not be created!")) nGroupIndex += 1 Return True End If Dim sProcessArguments As String = """" & sPipeLuaPath & """ " & """" & sConnection & """" ' leggo se modalita' debug - Dim nDebug As Integer = GetMainPrivateProfileInt(sGroupTitle & nGroupIndex.ToString(), K_DEBUG, 0) + Dim nDebug As Integer = GetMainPrivateProfileInt(sGroupName, K_DEBUG, 0) bDebug = (nDebug = 1) - NewExecEnvironmentManager = New ExecEnvironmentManager(nType, ExecEnvironment, nGroupIndex, sCamExePath, sProcessArguments, nMaxCamInstances, ExecProcessManager.ReturnModes.EVENT_, bDebug) - EgtOutLog(String.Format(sGroupTitle & "{0} created", nGroupIndex.ToString())) + NewExecEnvironmentManager = New ExecEnvironmentManager(nType, sGroupName, ExecEnvironment, nGroupIndex, sCamExePath, sProcessArguments, nMaxCamInstances, ExecProcessManager.ReturnModes.EVENT_, bDebug) + EgtOutLog(String.Format(sGroupName & " created")) Return True Else Return False End If End Function - Sub New(nType As EnvironmentCommunicationTypes, nEnvironment As EXECENVIRONMENTS, nGroupId As Integer, sProcessFileName As String, sProcessArguments As String, nMaxCamInstances As Integer, bReturnMode As ExecProcessManager.ReturnModes, bDebug As Boolean) + Sub New(nType As EnvironmentCommunicationTypes, sGroupName As String, nEnvironment As EXECENVIRONMENTS, nGroupId As Integer, sProcessFileName As String, sProcessArguments As String, nMaxCamInstances As Integer, bReturnMode As ExecProcessManager.ReturnModes, bDebug As Boolean) m_EnvironmentCommunicationType = nType + m_sGroupName = sGroupName Select Case m_EnvironmentCommunicationType Case EnvironmentCommunicationTypes.REDIS m_ExecEnvironment = nEnvironment @@ -192,13 +191,15 @@ Public Class ExecEnvironmentManager ConstChnName_EgwStatistics = sStatisticsChannelName.Replace("%%", "").Replace("@@", sIpAddress) ConstChnName_EgwDevStatistics = sStatisticsChannelName.Replace("%%", "Dev").Replace("@@", sIpAddress) m_chnEgwEngineOutput = New RedisChannel(ChnName_EgwEngineOutput, RedisChannel.PatternMode.Auto) + m_chnEgwEngineInput = New RedisChannel(ChnName_EgwEngineInput, RedisChannel.PatternMode.Auto) m_chnEgwStatistics = New RedisChannel(ChnName_EgwStatistics, RedisChannel.PatternMode.Auto) - m_RedisManager.SubscribeChannel(ChnName_EgwEngineInput, AddressOf EgwEngineInputHandler) + m_RedisManager.SubscribeChannel(m_chnEgwEngineInput, AddressOf EgwEngineInputHandler) Case EnvironmentCommunicationTypes.REST m_ExecEnvironment = nEnvironment m_ExecProcessManager = New ExecProcessManager(nGroupId + 1000, nEnvironment, sProcessFileName, sProcessArguments, nMaxCamInstances, ExecProcessManager.ReturnModes.EVENT_, bDebug) + m_chnEgwStatistics = New RedisChannel(ChnName_EgwStatistics, RedisChannel.PatternMode.Auto) AddHandler m_ExecProcessManager.m_AnswerReceived, AddressOf ExecProcessManager_AnswerReceived - 'AddHandler m_ExecProcessManager.m_Statistics, AddressOf ExecProcessManager_Statistics + AddHandler m_ExecProcessManager.m_Statistics, AddressOf ExecProcessManager_Statistics m_ExecProcessManager.StartExecutionThread() 'm_Client = New RestClient("https://office.egalware.com/lux/srv/api") m_Client = New RestClient("https://iis01.egalware.com/lux/srv/api") @@ -209,6 +210,21 @@ Public Class ExecEnvironmentManager End Select End Sub + Friend Shared Function GetExecEnvironmentFromString(sEnvironment As String) As EXECENVIRONMENTS + Select Case sEnvironment + Case "WINDOW" + Return EXECENVIRONMENTS.WINDOW + Case "BEAM" + Return EXECENVIRONMENTS.BEAM + Case "WALL" + Return EXECENVIRONMENTS.WALL + Case "CABINET" + Return EXECENVIRONMENTS.CABINET + Case Else + Return EXECENVIRONMENTS.NULL + End Select + End Function + Private Async Sub RestTimer_Tick(sender As Object, e As EventArgs) Dim nProcessedQuestion As Integer = 0 While m_ExecProcessManager.nFreeProcesses > 0 And m_ExecProcessManager.ArgumentsQueueCount < m_ExecProcessManager.nFreeProcesses And nProcessedQuestion < m_ExecProcessManager.nRunningProcesses @@ -253,7 +269,7 @@ Public Class ExecEnvironmentManager End If End If EgtOutLog(DateTime.Now.ToString("HH:mm:ss.fff") & " Environment=" & m_ExecEnvironment & " Channel=" & chnEgwEngineOutput.ToString() & " Answer Id=" & Answer.nId) - m_RedisManager.Subscriber.Publish(chnEgwEngineOutput, JsonConvert.SerializeObject(Answer)) + m_RedisManager.Publish(chnEgwEngineOutput, JsonConvert.SerializeObject(Answer)) m_stopWatch.Stop() ' Format and display the TimeSpan value. Dim elapsedTime As String = String.Format("{0:N3}", m_stopWatch.Elapsed.TotalMilliseconds) @@ -278,6 +294,8 @@ Public Class ExecEnvironmentManager request = New RestRequest("Prod/jobreturn", Method.Post) Case 2 request = New RestRequest("Prod/jobreturn", Method.Post) + Case 3 + request = New RestRequest("Prod/jobreturn", Method.Post) End Select End Select 'request.AddBody(JsonConvert.SerializeObject(Answer)) @@ -312,9 +330,9 @@ Public Class ExecEnvironmentManager Private Sub ExecProcessManager_Statistics(e As Statistics) Dim CurrManagerStatistics As Statistics = e CurrManagerStatistics.SetProcessingTimes(m_dMinProcessingTime, m_dMidProcessingTime, m_dMaxProcessingTime) - RaiseEvent StatisticUpdate(m_ExecEnvironment, CurrManagerStatistics) + RaiseEvent StatisticUpdate(m_sGroupName, CurrManagerStatistics) If Not IsNothing(m_chnEgwStatistics) Then - m_RedisManager.Subscriber.Publish(m_chnEgwStatistics, JsonConvert.SerializeObject(CurrManagerStatistics)) + m_RedisManager.Publish(m_chnEgwStatistics, JsonConvert.SerializeObject(CurrManagerStatistics)) End If m_nProcessingQty = 0 m_dMinProcessingTime = 100000 diff --git a/EgwMultiEngineManager.Tray/Utility/RedisManager.vb b/EgwMultiEngineManager.Tray/Utility/RedisManager.vb index f855bc9..009c357 100644 --- a/EgwMultiEngineManager.Tray/Utility/RedisManager.vb +++ b/EgwMultiEngineManager.Tray/Utility/RedisManager.vb @@ -1,4 +1,4 @@ -Imports System +Imports EgtDotNETBasis Imports StackExchange.Redis Public Class RedisManager @@ -36,10 +36,25 @@ Public Class RedisManager End Try End Sub - Friend Sub SubscribeChannel(sName As String, Handler As Action(Of RedisChannel, RedisValue)) - Dim InputChn As New RedisChannel(sName, RedisChannel.PatternMode.Auto) - Subscriber.Subscribe(InputChn, Handler) - End Sub + Friend Function SubscribeChannel(channel As RedisChannel, handler As Action(Of RedisChannel, RedisValue)) As Boolean + Try + Subscriber.Subscribe(channel, handler) + Return True + Catch ex As Exception + EgtOutLog(String.Format("Errore! Errore nella sottoscrizione Redis al canale {0}!", channel) & Environment.NewLine & ex.Message) + Return False + End Try + End Function + + Friend Function Publish(channel As RedisChannel, message As RedisValue) As Boolean + Try + Subscriber.Publish(channel, message) + Return True + Catch ex As Exception + EgtOutLog(String.Format("Errore! Errore nella pubblicazione Redis sul canale {0} del messaggio {1}!", channel, message) & Environment.NewLine & ex.Message) + Return False + End Try + End Function Protected Overridable Sub Dispose(disposing As Boolean) If Not disposedValue Then From 236c1f5be1596d5fce6310b453e1b342eab59fef Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Thu, 29 Jan 2026 10:25:23 +0100 Subject: [PATCH 3/3] - aggiunto parametro FreeOrWaitingAnswerProcesses - cambiato formato tempo di esecuzione in statistiche - gestita risposta SubMode 4 in Rest --- EgwMultiEngineManager.Core/ExecProcessManager.vb | 6 ++++++ EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb | 4 ++-- .../EgwMultiEngineManager.Data.vbproj | 6 +++--- EgwMultiEngineManager.Tray/Application.xaml.vb | 2 +- .../EgwMultiEngineManager.Tray.vbproj | 8 ++++---- EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb | 4 ++-- EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb | 2 ++ EgwMultiEngineManager.Tray/packages.config | 2 +- 8 files changed, 21 insertions(+), 13 deletions(-) diff --git a/EgwMultiEngineManager.Core/ExecProcessManager.vb b/EgwMultiEngineManager.Core/ExecProcessManager.vb index 2ea8846..3a3afa2 100644 --- a/EgwMultiEngineManager.Core/ExecProcessManager.vb +++ b/EgwMultiEngineManager.Core/ExecProcessManager.vb @@ -134,6 +134,12 @@ Public Class ExecProcessManager End Get End Property + Public ReadOnly Property nFreeOrWaitingAnswerProcesses As Integer + Get + Return ThreadDataList.Count(Function(x) x IsNot Nothing AndAlso (x.ProcessStatus = ThreadData.ProcessStatuses.NULL OrElse x.ProcessStatus = ThreadData.ProcessStatuses.ANSWERRECEIVED)) + End Get + End Property + Private PerMinResultQueueLock As New Object Private m_PerMinResultQueue As New Queue(Of Integer) Public ReadOnly Property PerMinResultQueue As Queue(Of Integer) diff --git a/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Core/My Project/AssemblyInfo.vb index ac9375b..f413368 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 91a0adf..7dcd48c 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. - 3.1.1.1 - 3.1.1.1 + 3.1.1.2 + 3.1.1.2 Egalware s.r.l. - 3.1.1.1 + 3.1.1.2 Emmanuele Sassi Specifiche comunicazione con EgwMultiEngineManager diff --git a/EgwMultiEngineManager.Tray/Application.xaml.vb b/EgwMultiEngineManager.Tray/Application.xaml.vb index 90b54cb..8b9a1b5 100644 --- a/EgwMultiEngineManager.Tray/Application.xaml.vb +++ b/EgwMultiEngineManager.Tray/Application.xaml.vb @@ -125,7 +125,7 @@ Class Application sTooltip &= If(nGroupType = EnvironmentCommunicationTypes.REST, "R", "G") & nGroupIndex.ToString() & CurrStatistics.nEngineRunningQty & CurrStatistics.nEngineProcessingQty & - CurrStatistics.dMidProcessingTime.ToString("N1") & + (CurrStatistics.dMidProcessingTime / 1000).ToString("N1") & CurrStatistics.nQuestionInQueue & CurrStatistics.nLastMinAnswer & CurrStatistics.nLast5MinAnswer & diff --git a/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj b/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj index 18ad4c6..cf48107 100644 --- a/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj +++ b/EgwMultiEngineManager.Tray/EgwMultiEngineManager.Tray.vbproj @@ -66,8 +66,8 @@ true - - ..\packages\EgtDotNETBasis.2.7.11.20\lib\EgtDotNETBasis.dll + + ..\packages\EgtDotNETBasis.3.1.1.3\lib\EgtDotNETBasis.dll ..\..\EgwWPFBaseLib\EgwWPFBaseLib\bin\Debug\EgwWPFBaseLib.dll @@ -247,10 +247,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) $(TargetPath) - + \ No newline at end of file diff --git a/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb b/EgwMultiEngineManager.Tray/My Project/AssemblyInfo.vb index 76383d9..945f16d 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 807008f..13c82b6 100644 --- a/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb +++ b/EgwMultiEngineManager.Tray/Utility/EnvironmentManager.vb @@ -296,6 +296,8 @@ Public Class ExecEnvironmentManager request = New RestRequest("Prod/jobreturn", Method.Post) Case 3 request = New RestRequest("Prod/jobreturn", Method.Post) + Case 4 + request = New RestRequest("Prod/jobreturn", Method.Post) End Select End Select 'request.AddBody(JsonConvert.SerializeObject(Answer)) diff --git a/EgwMultiEngineManager.Tray/packages.config b/EgwMultiEngineManager.Tray/packages.config index 3cb879f..36e4df7 100644 --- a/EgwMultiEngineManager.Tray/packages.config +++ b/EgwMultiEngineManager.Tray/packages.config @@ -1,6 +1,6 @@  - +