diff --git a/WebDoorCreator.CamSrv/ProcMan.Designer.vb b/WebDoorCreator.CamSrv/ProcMan.Designer.vb index e3f6c4e..52e705c 100644 --- a/WebDoorCreator.CamSrv/ProcMan.Designer.vb +++ b/WebDoorCreator.CamSrv/ProcMan.Designer.vb @@ -42,10 +42,11 @@ Partial Class ProcMan Me.TimerUI = New System.Windows.Forms.Timer(Me.components) Me.TimerProgBar = New System.Windows.Forms.Timer(Me.components) Me.LISTThreadStatus = New System.Windows.Forms.ListView() - Me.GroupBox1 = New System.Windows.Forms.GroupBox() Me.chThread = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) - Me.chJob = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) Me.chTime = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.chOther = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader) + Me.GroupBox1 = New System.Windows.Forms.GroupBox() + Me.chkStatAggr = New System.Windows.Forms.CheckBox() Me.StatusStrip1.SuspendLayout() Me.GroupBox1.SuspendLayout() Me.SuspendLayout() @@ -140,7 +141,7 @@ Partial Class ProcMan Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsProgBar}) Me.StatusStrip1.Location = New System.Drawing.Point(0, 423) Me.StatusStrip1.Name = "StatusStrip1" - Me.StatusStrip1.Size = New System.Drawing.Size(510, 22) + Me.StatusStrip1.Size = New System.Drawing.Size(552, 22) Me.StatusStrip1.TabIndex = 11 Me.StatusStrip1.Text = "StatusStrip1" ' @@ -200,17 +201,33 @@ Partial Class ProcMan ' 'LISTThreadStatus ' - Me.LISTThreadStatus.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.chThread, Me.chJob, Me.chTime}) + Me.LISTThreadStatus.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.chThread, Me.chTime, Me.chOther}) Me.LISTThreadStatus.HideSelection = False Me.LISTThreadStatus.Location = New System.Drawing.Point(13, 48) Me.LISTThreadStatus.Name = "LISTThreadStatus" - Me.LISTThreadStatus.Size = New System.Drawing.Size(306, 302) + Me.LISTThreadStatus.Size = New System.Drawing.Size(403, 302) Me.LISTThreadStatus.TabIndex = 16 Me.LISTThreadStatus.UseCompatibleStateImageBehavior = False Me.LISTThreadStatus.View = System.Windows.Forms.View.Details ' + 'chThread + ' + Me.chThread.Text = "Thread" + Me.chThread.Width = 100 + ' + 'chTime + ' + Me.chTime.Text = "Time" + Me.chTime.Width = 100 + ' + 'chOther + ' + Me.chOther.Text = "Other" + Me.chOther.Width = 100 + ' 'GroupBox1 ' + Me.GroupBox1.Controls.Add(Me.chkStatAggr) Me.GroupBox1.Controls.Add(Me.LISTThreadStatus) Me.GroupBox1.Controls.Add(Me.lblRunning) Me.GroupBox1.Controls.Add(Me.txtNumThread) @@ -219,31 +236,28 @@ Partial Class ProcMan Me.GroupBox1.Controls.Add(Me.StartProcess) Me.GroupBox1.Location = New System.Drawing.Point(118, 64) Me.GroupBox1.Name = "GroupBox1" - Me.GroupBox1.Size = New System.Drawing.Size(338, 356) + Me.GroupBox1.Size = New System.Drawing.Size(422, 356) Me.GroupBox1.TabIndex = 17 Me.GroupBox1.TabStop = False Me.GroupBox1.Text = "Threads" ' - 'chThread + 'chkStatAggr ' - Me.chThread.Text = "Thread" - Me.chThread.Width = 20 - ' - 'chJob - ' - Me.chJob.Text = "Job" - Me.chJob.Width = 100 - ' - 'chTime - ' - Me.chTime.Text = "Time" - Me.chTime.Width = 180 + Me.chkStatAggr.AutoSize = True + Me.chkStatAggr.Checked = True + Me.chkStatAggr.CheckState = System.Windows.Forms.CheckState.Checked + Me.chkStatAggr.Location = New System.Drawing.Point(326, 21) + Me.chkStatAggr.Name = "chkStatAggr" + Me.chkStatAggr.Size = New System.Drawing.Size(75, 17) + Me.chkStatAggr.TabIndex = 17 + Me.chkStatAggr.Text = "Aggr Stats" + Me.chkStatAggr.UseVisualStyleBackColor = True ' 'ProcMan ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(510, 445) + Me.ClientSize = New System.Drawing.Size(552, 445) Me.Controls.Add(Me.GroupBox1) Me.Controls.Add(Me.txtQueue) Me.Controls.Add(Me.StatusStrip1) @@ -286,6 +300,7 @@ Partial Class ProcMan Friend WithEvents LISTThreadStatus As ListView Friend WithEvents GroupBox1 As GroupBox Friend WithEvents chThread As ColumnHeader - Friend WithEvents chJob As ColumnHeader Friend WithEvents chTime As ColumnHeader + Friend WithEvents chOther As ColumnHeader + Friend WithEvents chkStatAggr As CheckBox End Class diff --git a/WebDoorCreator.CamSrv/ProcMan.vb b/WebDoorCreator.CamSrv/ProcMan.vb index 4d14ee7..ab0c20d 100644 --- a/WebDoorCreator.CamSrv/ProcMan.vb +++ b/WebDoorCreator.CamSrv/ProcMan.vb @@ -535,6 +535,8 @@ Public Class ProcMan Dim sExePath As String = "c:\EgtProg\EgtEngine\EgtEngineR32.exe" Dim sCurrDdfDir As String = "c:\EgtData\WebDoor\Ddf" Dim stopWatch As New Stopwatch() + Dim lExeTime As Long = 0 + Dim lOtherTime As Long = 0 While Not m_bStopProcess @@ -548,8 +550,8 @@ Public Class ProcMan If bOk Then ' avvio cronometro - stopWatch.Reset() - stopWatch.Start() + 'stopWatch.Reset() + stopWatch.Restart() ' svuoto vecchio set file della porta richiesta Dim fileList As String() = Directory.GetFiles(sCurrDdfDir, Item.Key + ".*") ' elimino vecchi @@ -580,6 +582,10 @@ Public Class ProcMan While Not Proc.HasExited Thread.Sleep(1) End While + ' salvo exe time... + stopWatch.Stop() + lExeTime = stopWatch.ElapsedMilliseconds + stopWatch.Restart() Dim procResults As New List(Of CalcResultDTO) Dim currRes As New CalcResultDTO Dim fContent As String = "" @@ -600,9 +606,9 @@ Public Class ProcMan Dim respPut As String = currWDC.SendProcResults(procResults) stopWatch.Stop() + lOtherTime = stopWatch.ElapsedMilliseconds ' aggiorno thread display... - UpdateThreadList("0", Item.Key, $"{stopWatch.ElapsedMilliseconds:N2} ms") - + UpdateThreadList(Item.Key, lExeTime, lOtherTime) End If stopWatch.Stop() @@ -635,29 +641,64 @@ Public Class ProcMan End If End Sub + + Private isUpdatingThreads As Boolean = False ''' ''' Esecuzione update display lista stato threads ''' - Private Sub UpdateThreadList(tId As String, tStatus As String, tTime As String) + Private Sub UpdateThreadList(tId As String, tExeCam As Long, tOther As Long) synchronizationContext.Post(New SendOrPostCallback( Sub(o) - 'Begin the update - LISTThreadStatus.BeginUpdate() - ' elimino ultimo in coda e metto in testa... - Dim maxItems As Integer = 20 - Dim numItems = LISTThreadStatus.Items.Count - If numItems > maxItems Then - LISTThreadStatus.Items.RemoveAt(0) + If Not isUpdatingThreads Then + isUpdatingThreads = True + ProcStats.RecordData($"{m_MaxCamInstances}", tExeCam, tOther) + ProcStats.RecordList.Enqueue((tId, tExeCam, tOther)) + 'Begin the update + LISTThreadStatus.BeginUpdate() + LISTThreadStatus.Items.Clear() + + ' compilo in base al tipo di stat richiesta + If (chkStatAggr.Checked) Then + ' statistiche di sintesi + + Dim sorted = From pair In ProcStats.ExeCumSum + Order By pair.Key + For Each item In sorted + LISTThreadStatus.Items.Add( + New ListViewItem(New String() {item.Key, + $"{item.Value.NumRec} x {item.Value.ExeTime / item.Value.NumRec:N2} ms", + $"{item.Value.NumRec} x {item.Value.OthTime / item.Value.NumRec:N2} ms" + })) + Next + Else + ' formato log + Dim maxItems As Integer = 15 + While ProcStats.RecordList.Count > maxItems + Dim oldItem As (String, Long, Long) = ("", 0, 0) + ProcStats.RecordList.TryDequeue(oldItem) + End While + + For Each item As (String, Long, Long) In ProcStats.RecordList.Reverse + LISTThreadStatus.Items.Add(New ListViewItem(New String() { + item.Item1, + $"{item.Item2} ms", + $"{item.Item3} ms" + })) + Next + + + End If + + 'End the update + LISTThreadStatus.EndUpdate() + isUpdatingThreads = False End If - 'Add item on top - LISTThreadStatus.Items.Add(New ListViewItem(New String() {tId, tStatus, tTime})) - 'End the update - LISTThreadStatus.EndUpdate() End Sub ), "") End Sub + #End Region #If False Then diff --git a/WebDoorCreator.SDK/ProcStats.cs b/WebDoorCreator.SDK/ProcStats.cs new file mode 100644 index 0000000..6a3e709 --- /dev/null +++ b/WebDoorCreator.SDK/ProcStats.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebDoorCreator.SDK +{ + public class ProcStats + { + private static ConcurrentDictionary Counter = new ConcurrentDictionary(); + private static ConcurrentDictionary Timers = new ConcurrentDictionary(); + internal static void UpdateStat(string functionName, long timer) + { + if (!Timers.ContainsKey(functionName)) + Timers.TryAdd(functionName, timer); + else + Timers[functionName] += timer; + + if (!Counter.ContainsKey(functionName)) + Counter.TryAdd(functionName, 1); + else + Counter[functionName]++; + } + + internal volatile static Dictionary RunningThreadStatus = new Dictionary(); + + public static ConcurrentQueue<(string, long, long)> RecordList = new ConcurrentQueue<(string, long, long)>(); + public static ConcurrentDictionary ExeCumSum = new ConcurrentDictionary(); + + public static bool RecordData(string nameRef, long exeTime, long othTime) + { + bool fatto = false; + if (ExeCumSum.ContainsKey(nameRef)) + { + ExeCumSum[nameRef].NumRec++; + ExeCumSum[nameRef].ExeTime += exeTime; + ExeCumSum[nameRef].OthTime += othTime; + } + else + { + ExeCumSum.TryAdd(nameRef, new CumSumData(1, exeTime, othTime)); + } + return fatto; + } + + public class CumSumData + { + public CumSumData(long nrec, long eTime, long oTime) + { + NumRec = nrec; + ExeTime = eTime; + OthTime = oTime; + } + public long NumRec { get; set; } = 0; + public long ExeTime { get; set; } = 0; + public long OthTime { get; set; } = 0; + } + } +} diff --git a/WebDoorCreator.SDK/WDC.cs b/WebDoorCreator.SDK/WDC.cs index 9910677..86ea392 100644 --- a/WebDoorCreator.SDK/WDC.cs +++ b/WebDoorCreator.SDK/WDC.cs @@ -363,6 +363,5 @@ namespace WebDoorCreator.SDK } #endregion Protected Methods - } } \ No newline at end of file diff --git a/WebDoorCreator.SDK/WebDoorCreator.SDK.csproj b/WebDoorCreator.SDK/WebDoorCreator.SDK.csproj index d882183..e0b3223 100644 --- a/WebDoorCreator.SDK/WebDoorCreator.SDK.csproj +++ b/WebDoorCreator.SDK/WebDoorCreator.SDK.csproj @@ -77,6 +77,7 @@ +