From f7afcd866d8b2b585e4357a23d4b5face53569e9 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Tue, 1 Dec 2020 15:50:04 +0100 Subject: [PATCH] Fix comportamento lock threads --- CVCncLib/CVCncLib.dll | Bin 967680 -> 967680 bytes IOB-MAN/App.config | 2 +- IOB-MAN/IOBManPanel.cs | 95 +++++++++++++++++------------------------ IOB-MAN/NLog.config | 12 +++--- 4 files changed, 47 insertions(+), 62 deletions(-) diff --git a/CVCncLib/CVCncLib.dll b/CVCncLib/CVCncLib.dll index c17d5ad976402bfa00596e6fbb8a25aedc84dc5e..5b7b3bca08f1d869b790438d1bd1f0f767dd4c43 100644 GIT binary patch delta 134 zcmZqZux{wEp3uQO%i~yMcWXCeYd2GCH*;$@OKUf4Yd2eKH+yS0M{74{Yd2SGH}}?V z9?OLSby5Cpl3ad%E3GV^iwK^MX}_|N2Z(vMUs=fahffD+R6GL^Fafa)BLl;Wb9@Xh iHt;b71-k^RA2wAu>t5zFL(%=Hd2qMw_CFi=ScCy{;W0S? delta 134 zcmZqZux{wEp3uQu{d7lTcWXCeYd2GCH*;$@OKUf4Yd2eKH+yS0M{74{Yd2SGH}}?V z9?OLSt}D$r&39_L?%nxFZ1+T~$L&`Z@&GaK_A3kd{_yDljf!Ug0wy4qVPs%|t3i}9HY@Af|%_*jGiIG!{~ diff --git a/IOB-MAN/App.config b/IOB-MAN/App.config index 1aca5e38..f0b075f6 100644 --- a/IOB-MAN/App.config +++ b/IOB-MAN/App.config @@ -8,7 +8,7 @@ - + diff --git a/IOB-MAN/IOBManPanel.cs b/IOB-MAN/IOBManPanel.cs index 4f6d790f..fdeaf446 100644 --- a/IOB-MAN/IOBManPanel.cs +++ b/IOB-MAN/IOBManPanel.cs @@ -25,16 +25,16 @@ namespace IOB_MAN private const int SW_SHOWMINIMIZED = 2; private const int SW_SHOWNORMAL = 1; - /// - /// Oggetto locker x evitare problemi timer - /// - private static object _locker = new object(); - /// /// Context x sync thread /// private readonly SynchronizationContext synchronizationContext; + /// + /// Oggetto semaforico di lock + /// + private SemaphoreSlim _sync = new SemaphoreSlim(1); + /// /// Binding source degli elementi gestiti.. /// @@ -57,7 +57,7 @@ namespace IOB_MAN /// /// Counter del timer di base /// - protected int checkPeriod = 1000; + protected int checkPeriod = 2000; /// /// semaforo check... @@ -67,7 +67,7 @@ namespace IOB_MAN /// /// Counter del timer di forceCheck (60 sec, era 5 sec) /// - protected int forceCheckPeriod = 60000; + protected int forceCheckPeriodMult = 30; /// /// Indica ultimo stato del check di restart... @@ -84,6 +84,16 @@ namespace IOB_MAN /// protected int lastNumProcRunning = 0; + /// + /// Numero di Lock effettuati con successo + /// + protected int numLockFail = 0; + + /// + /// Numero di lock falliti + /// + protected int numLockSuccess = 0; + /// /// Totale processi avviati /// @@ -105,9 +115,9 @@ namespace IOB_MAN protected string TargetName = ""; /// - /// Contatore autockeck nativo + /// Dataora prossima scadenza riavvio automatico /// - protected int tOutAutocheck = 100; + protected DateTime tOutAutocheck = DateTime.Now; /// /// Counter del timer UI @@ -314,7 +324,7 @@ namespace IOB_MAN private void btnMoreTOut_Click(object sender, EventArgs e) { - tOutAutocheck += 60 * utils.CRI("autoRestartTimeoutMin") * (1000 / (utils.CRI("checkPeriod"))); + tOutAutocheck = tOutAutocheck.AddMinutes(utils.CRI("autoRestartTimeoutMin")); } private void btnOpenAll_Click(object sender, EventArgs e) @@ -410,32 +420,23 @@ namespace IOB_MAN /// private async Task checkProcessStatusAsync() { - var hasLock = false; - try - { - Monitor.TryEnter(_locker, ref hasLock); - if (!hasLock) - { - return; - } - if (!checkRunning) - { - // reset variabili appoggio - checkRunning = true; - // eseguo task! - await Task.Run(() => checkRunningchild()).ConfigureAwait(false); - updateStatus(); - checkRunning = false; - } - } - finally + await _sync.WaitAsync(); + + if (!checkRunning) { + // reset variabili appoggio + checkRunning = true; + // eseguo task! + await Task.Run(() => checkRunningchild()).ConfigureAwait(false); + updateStatus(); checkRunning = false; - if (hasLock) - { - Monitor.Exit(_locker); - } } + else + { + utils.lgInfo($"Error: checkRunning: {checkRunning}"); + } + + _sync.Release(); } /// @@ -505,7 +506,7 @@ namespace IOB_MAN private void chkAutoRestart_CheckedChanged(object sender, EventArgs e) { // se tolgo autorestart --> imposto NUOVA scadenza x forzare check - tOutAutocheck = 60 * utils.CRI("autoRestartTimeoutMin") * (1000 / (utils.CRI("checkPeriod"))); + tOutAutocheck = DateTime.Now.AddMinutes(utils.CRI("autoRestartTimeoutMin")); txtTOutAutoCheck.Visible = !chkAutoRestart.Checked; btnMoreTOut.Visible = !chkAutoRestart.Checked; // fa subito controllo riavvio... @@ -744,21 +745,6 @@ namespace IOB_MAN private void forceCheckTimer_Tick(object sender, EventArgs e) { -#if false - if (!checkRunning) - { - try - { - Task result = checkProcessStatusAsync(); - result.Wait(); - } - catch (Exception exc) - { - Logging.Instance.Error($"forceCheckTimer_Tick {exc}"); - } - } -#endif - if (!checkRunning) { try @@ -856,7 +842,7 @@ namespace IOB_MAN MainTimer.Start(); UI_Timer.Interval = uiPeriod; UI_Timer.Start(); - forceCheckTimer.Interval = forceCheckPeriod; + forceCheckTimer.Interval = checkPeriod * forceCheckPeriodMult; forceCheckTimer.Start(); // avvio il task con apposita classe Steamware... da 00:30 int fullRestartHour = memLayer.ML.CRI("fullRestartHour"); @@ -934,7 +920,7 @@ namespace IOB_MAN waitForExitMsec = utils.CRI("waitForExitMsec"); checkPeriod = utils.CRI("checkPeriod"); uiPeriod = utils.CRI("uiPeriod"); - forceCheckPeriod = utils.CRI("forceCheckPeriod"); + forceCheckPeriodMult = utils.CRI("forceCheckPeriodMult"); TargetExe = utils.CRS("targetExe"); TargetName = utils.CRS("appNameExt"); if (string.IsNullOrEmpty(TargetExe)) @@ -1075,7 +1061,7 @@ namespace IOB_MAN else { // se autorestart scaduto e NON checked --> lo imposto - if (tOutAutocheck < 0) + if (tOutAutocheck < DateTime.Now) { // lo riattivo chkAutoRestart.Checked = true; @@ -1239,13 +1225,12 @@ namespace IOB_MAN // se NON checked aggiorno contatore... if (!chkAutoRestart.Checked) { - tOutAutocheck--; - txtTOutAutoCheck.Text = $"{(tOutAutocheck / (1000 / (utils.CRI("checkPeriod"))))}"; + txtTOutAutoCheck.Text = $"{tOutAutocheck.Subtract(DateTime.Now).TotalSeconds:N0}"; } // se รจ variato... if (hlRestart != lastHlRestart) { - tOutAutocheck = 60 * utils.CRI("autoRestartTimeoutMin") * (1000 / (utils.CRI("checkPeriod"))); + tOutAutocheck = DateTime.Now.AddMinutes(utils.CRI("autoRestartTimeoutMin")); lastHlRestart = hlRestart; // fix autorestart... if (hlRestart) diff --git a/IOB-MAN/NLog.config b/IOB-MAN/NLog.config index ff4a5d80..ed129685 100644 --- a/IOB-MAN/NLog.config +++ b/IOB-MAN/NLog.config @@ -23,9 +23,9 @@ -->