1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| //---------------------------------------------------------------------------
void __fastcall TxxxCameraPollThread::Execute(void)
{
try
{
while ( ! Terminated)
{
if (WaitForNextPoll())
{
xxxFormatOutputDebugString("[Info] - Session de Polling - %d Caméras", (FRegisteredCameraList.size()));
for (TxxxCameraPollTools::TCameraDeviceNumberList::const_iterator it = FRegisteredCameraList.begin(); it != FRegisteredCameraList.end(); ++it)
{
if ( ! Terminated)
{
try
{
TxxxCamera *ObjCam = TxxxCameraManager::ProviderManager()->FindByDeviceNumber(*it);
if (ObjCam)
{
if (ObjCam->IncrementReference())
{
try
{
if ( ! Terminated)
{
TxxxCameraTestConnectionState TestConnectionState = ObjCam->TestConnectionState;
// Un Test est en attente de démarrage ou est toujours en cours !
// On considère que c'est un défaut, de toute façon on relance un autre test !
if ( ! Terminated && ((TestConnectionState == sctcsWaiting) || (TestConnectionState == sctcsRunning)))
{
ObjCam->TestConnectionTimedOut();
if (FOnNoPolling)
FOnNoPolling(ObjCam);
}
// TestConnection peut être bloquant ou pas, cela dépend l'implémentation
if ( ! Terminated)
{
TestConnectionState = ObjCam->TestConnection();
// La Demande de Test n'a pas pu être faite, je considère cela comme un Défaut !
if ( ! Terminated && ((TestConnectionState == sctcsNone) || (TestConnectionState == sctcsUnreachable)))
if (FOnNoPolling)
FOnNoPolling(ObjCam);
}
}
}
__finally
{
ObjCam->ReleaseReference();
}
}
}
}
catch(const Exception &e)
{
xxxOutputExceptionString("[Error] %0:s::Execute : %2:s [%1:s]", this, e);
}
}
else
break;
}
}
}
}
catch(Exception *e)
{
FExceptionClass = e->ClassType();
FExceptionMessage = e->Message;
if (FOnException)
FOnException(this);
}
if (FOnFinish)
FOnFinish(this);
}
//---------------------------------------------------------------------------
bool TxxxCameraPollThread::WaitForNextPoll()
{
// Le Premier Démarrage est au bout de 5 secondes !
// Les Suivants seront en fonction du Délai
if (FNextPollingTime.Val <= 0)
FNextPollingTime = IncSecond(Now(), 5);
else
// Positif, c'est le vrai Polling, en Minute
// Négatf, c'est le débogage du Polling, en Seconde !
if (FPollingDelayMinute > 0)
FNextPollingTime = IncMinute(Now(), FPollingDelayMinute);
else
FNextPollingTime = IncSecond(Now(), -FPollingDelayMinute);
// On attend tant que le Délai n'est pas écoulé
// On vérifie régulièrement que l'on a pas demandé l'abandon du Polling !
while ( ! Terminated && (FNextPollingTime >= Now()))
Sleep(10);
return ! Terminated;
} |
Partager