Forzo update x minimizzare invio redis

This commit is contained in:
Samuele Locatelli
2026-05-25 16:59:22 +02:00
parent e1d7cb38e6
commit 62a2a1d251
8 changed files with 89 additions and 112 deletions
+1 -2
View File
@@ -33,5 +33,4 @@ CLI_INST=SteamWareSim
;STARTLIST=3001
STARTLIST=SIMUL_01
MAXCNC=10
+86 -101
View File
@@ -1338,15 +1338,16 @@ namespace IOB_WIN_FORM
/// </summary>
private CancellationTokenSource _ctsMachine;
/// <summary>
/// Cancellation tocken x processi verso server
/// </summary>
private CancellationTokenSource _ctsServer;
/// <summary>
/// Cancellation tocken x processi verso Redis
/// </summary>
private CancellationTokenSource _ctsRedis;
/// <summary>
/// Cancellation tocken x processi verso server
/// </summary>
private CancellationTokenSource _ctsServer;
/// <summary>
/// Ritardo per errori (extra nei cicli)
/// </summary>
@@ -2132,6 +2133,86 @@ namespace IOB_WIN_FORM
}
}
/// <summary>
/// Metodo x gestione I/O Redis (status IOB)
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
private async Task RedisWorkerLoopAsync(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
if (iobObj != null)
{
// 1. Estrazione dati dalle code (operazione logica)
long alQueueLen = iobObj.QHelp.QueueAlarm.Count;
long evQueueLen = iobObj.QHelp.QueueIN.Count;
long flQueueLen = iobObj.QHelp.QueueFLog.Count;
long msQueueLen = iobObj.QHelp.QueueMessages.Count;
long rtrQueueLen = iobObj.QHelp.QueueRawTransf.Count;
long ulQueueLen = iobObj.QHelp.QueueULog.Count;
var setPar = new Dictionary<string, string>
{
{ "IP", iobObj.IOBConfFull.Device.Connect.IpAddr },
{ "PORT", iobObj.IOBConfFull.Device.Connect.Port }
};
IobWinStatus currIobStatus = new IobWinStatus()
{
CodIob = iobObj.IOBConfFull.General.FilenameIOB,
IobType = $"{iobObj.IOBConfFull.General.IobType}",
queueAlLen = alQueueLen,
queueEvLen = evQueueLen,
queueFlLen = flQueueLen,
queueMsLen = msQueueLen,
queueRawTransfLen = rtrQueueLen,
queueUlLen = ulQueueLen,
counterIOB = iobObj.contapezziIOB,
counterMAC = iobObj.contapezziPLC,
lastUpdate = lastIobStatus.lastUpdate > iobObj.DtHelp.lastWatchDog ? lastIobStatus.lastUpdate : iobObj.DtHelp.lastWatchDog,
online = utils.IOB_Online,
lastDataIn = iobObj.DtHelp.lastReadPLC,
lastDataOut = iobObj.DtHelp.lastIobOnline,
setupParams = setPar,
freeNotes = $"{iobObj.IOBConfFull.General.FilenameIOB} | DT ultimo avvio: {iobObj.DtHelp.AvvioAdp}"
};
// 2. Logica di salvataggio su REDIS (Rete -> Thread di background!)
if (!currIobStatus.Equals(lastIobStatus))
{
currIobStatus.lastUpdate = DateTime.Now;
iobObj.redisMan.iobStatus = currIobStatus;
lastIobStatus = currIobStatus;
}
if (lastSrvStatus.online != utils.MPIO_Online)
{
ServerMpStatus currSrvStatus = iobObj.redisMan.servStatus;
currSrvStatus.online = utils.MPIO_Online;
currSrvStatus.lastUpdate = DateTime.Now;
iobObj.redisMan.servStatus = currSrvStatus;
lastSrvStatus = currSrvStatus;
}
}
}
catch (Exception exc)
{
lgError($"Eccezione nel background gather: {exc}");
}
// Calcolo del delay dinamico tra standard e suspended da Timers.MsHF
int currentDelay = _isSuspended ? IOBConfFull.General.Timers.MsMF : IOBConfFull.General.Timers.MsHF;
// in ogni caso max 15 sec di attesa...
currentDelay = currentDelay > 15000 ? 15000 : currentDelay;
await Task.Delay(currentDelay, token);
}
}
private void refreshFormData()
{
// verifica se mostrare update
@@ -2191,7 +2272,7 @@ namespace IOB_WIN_FORM
// salvo su redis e in obj corrente
iobObj.redisMan.servStatus = currSrvStatus;
lastSrvStatus = currSrvStatus;
}
}
#endif
}
@@ -2383,7 +2464,6 @@ namespace IOB_WIN_FORM
lgInfo("--- WORKER REDIS AVVIATO ---");
}
// avvio altro thread di comunicazione server...
// 1. Controllo se è già in esecuzione
if (_workerTask != null && !_workerTask.IsCompleted)
@@ -2464,101 +2544,6 @@ namespace IOB_WIN_FORM
checkAssignSize();
}
/// <summary>
/// Metodo x gestione I/O Redis (status IOB)
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
private async Task RedisWorkerLoopAsync(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
try
{
if (iobObj != null)
{
// 1. Estrazione dati dalle code (operazione logica)
long alQueueLen = iobObj.QHelp.QueueAlarm.Count;
long evQueueLen = iobObj.QHelp.QueueIN.Count;
long flQueueLen = iobObj.QHelp.QueueFLog.Count;
long msQueueLen = iobObj.QHelp.QueueMessages.Count;
long rtrQueueLen = iobObj.QHelp.QueueRawTransf.Count;
long ulQueueLen = iobObj.QHelp.QueueULog.Count;
var setPar = new Dictionary<string, string>
{
{ "IP", iobObj.IOBConfFull.Device.Connect.IpAddr },
{ "PORT", iobObj.IOBConfFull.Device.Connect.Port }
};
IobWinStatus currIobStatus = new IobWinStatus()
{
CodIob = iobObj.IOBConfFull.General.FilenameIOB,
IobType = $"{iobObj.IOBConfFull.General.IobType}",
queueAlLen = alQueueLen,
queueEvLen = evQueueLen,
queueFlLen = flQueueLen,
queueMsLen = msQueueLen,
queueRawTransfLen = rtrQueueLen,
queueUlLen = ulQueueLen,
counterIOB = iobObj.contapezziIOB,
counterMAC = iobObj.contapezziPLC,
lastUpdate = lastIobStatus.lastUpdate > iobObj.DtHelp.lastWatchDog ? lastIobStatus.lastUpdate : iobObj.DtHelp.lastWatchDog,
online = utils.IOB_Online,
lastDataIn = iobObj.DtHelp.lastReadPLC,
lastDataOut = iobObj.DtHelp.lastIobOnline,
setupParams = setPar,
freeNotes = $"{iobObj.IOBConfFull.General.FilenameIOB} | DT ultimo avvio: {iobObj.DtHelp.AvvioAdp}"
};
// 2. Logica di salvataggio su REDIS (Rete -> Thread di background!)
if (!currIobStatus.Equals(lastIobStatus))
{
currIobStatus.lastUpdate = DateTime.Now;
iobObj.redisMan.iobStatus = currIobStatus;
lastIobStatus = currIobStatus;
}
if (lastSrvStatus.online != utils.MPIO_Online)
{
ServerMpStatus currSrvStatus = iobObj.redisMan.servStatus;
currSrvStatus.online = utils.MPIO_Online;
currSrvStatus.lastUpdate = DateTime.Now;
iobObj.redisMan.servStatus = currSrvStatus;
lastSrvStatus = currSrvStatus;
}
// 3. Prepariamo i dati per la UI e li salviamo in modo thread-safe
lock (_statusLock)
{
_latestSnapshotForUI = currIobStatus;
_cachedCounterIob = $"pz MES {iobObj.contapezziIOB}";
_cachedCounterMac = $"pz PLC {iobObj.contapezziPLC}";
}
}
}
catch (Exception exc)
{
lgError($"Eccezione nel background gather: {exc}");
}
// Frequenza di aggiornamento Redis/Code (es. ogni 1 secondo)
// Rilascia la CPU senza fare context switch distruttivi
await Task.Delay(1000, token);
}
}
// Oggetto per il lock thread-safe
private readonly object _statusLock = new object();
// Questa variabile conterrà l'ultimo stato valido calcolato in background
private IobWinStatus _latestSnapshotForUI;
// Stringhe pronte per la UI calcolate in background per evitare manipolazioni di stringhe sul thread UI
private string _cachedCounterIob = "";
private string _cachedCounterMac = "";
private string _cachedNote = "";
/// <summary>
/// Loop di gestione worker
/// </summary>
-2
View File
@@ -20,5 +20,3 @@ CLI_INST=SteamWareSim
STARTLIST=FTP_SONATEST
MAXCNC=10
-1
View File
@@ -27,4 +27,3 @@ STARTLIST=3024
;STARTLIST=LVF652
MAXCNC=10
-1
View File
@@ -34,4 +34,3 @@ STARTLIST=SIMUL_01
;STARTLIST=3026
MAXCNC=10
-1
View File
@@ -20,4 +20,3 @@ STARTLIST=SIMUL_01
;STARTLIST=3023-PING
MAXCNC=10
+1 -2
View File
@@ -41,5 +41,4 @@ CLI_INST=SteamWareSim
;STARTLIST=SIMUL_01
STARTLIST=3010
MAXCNC=10
+1 -2
View File
@@ -23,5 +23,4 @@ STARTLIST=3018
;STARTLIST=3019
;STARTLIST=SIMUL_06
MAXCNC=10