Forzo update x minimizzare invio redis
This commit is contained in:
@@ -33,5 +33,4 @@ CLI_INST=SteamWareSim
|
||||
;STARTLIST=3001
|
||||
STARTLIST=SIMUL_01
|
||||
|
||||
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
+86
-101
@@ -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>
|
||||
|
||||
@@ -20,5 +20,3 @@ CLI_INST=SteamWareSim
|
||||
STARTLIST=FTP_SONATEST
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
|
||||
|
||||
@@ -27,4 +27,3 @@ STARTLIST=3024
|
||||
;STARTLIST=LVF652
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
|
||||
@@ -34,4 +34,3 @@ STARTLIST=SIMUL_01
|
||||
;STARTLIST=3026
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
|
||||
@@ -20,4 +20,3 @@ STARTLIST=SIMUL_01
|
||||
;STARTLIST=3023-PING
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
|
||||
@@ -41,5 +41,4 @@ CLI_INST=SteamWareSim
|
||||
;STARTLIST=SIMUL_01
|
||||
STARTLIST=3010
|
||||
|
||||
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
@@ -23,5 +23,4 @@ STARTLIST=3018
|
||||
;STARTLIST=3019
|
||||
;STARTLIST=SIMUL_06
|
||||
|
||||
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
Reference in New Issue
Block a user