[C++] Hoe implementeer ik een Watchdog

Pagina: 1
Acties:

  • simenon
  • Registratie: Januari 2001
  • Laatst online: 03-02-2023
Hoi,

ik heb momenteel een simulatie gemaakt die een paar toestanden nagaat volgens het state-pattern. Nu wil ik echter hier een Watchdog op maken die controleert of de simulatie niet te lang in een bepaald toestand blijft. Als hij telang in een toestand blijft dan genereert de watchdog een error of timeout ofzoiets dergelijks. Als er overgegaan wordt naar een nieuwe toestand dan wordt de watchdog opnieuw gereset. Het probleem is dat ik niet goed weet hoe ik de watchdog moet opzetten. Ook weet ik niet hoe ik het met de timeout in de watchdog moet doen (bestaat vast een functie voor in C++ Builder maar weet niet welke). Als ik dit weet dan zal het voor de rest geen probleem zijn om de watchdog te 'resetten' en aan te roepen vanuit de simulatie.

  • Boy
  • Registratie: November 2001
  • Laatst online: 15-09 21:13

Boy

www.byoscoop.nl

Ik wil hier het antwoord wel van zien...

Naar de bioscoop? => gebruik de app op Byoscoop.nl


Verwijderd

Kan je niet gewoon een timer maken die de tijd telt dat een bepaalde functie bezig is met een berekening, en als ie langer dan een bepaalde tijd er over doet dat ie dan een error geeft ?

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Start een thread die per tijdsinterval checkt hoe lang hij al actief is.

Bij het starten van deze thread lees je de system timer uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// D'r moet hier vast nog wel het een en ander gedeclareerd worden.


time_t startTijd;
time (&startTijd);

while(wait == true)
{
    Sleep(1000); //1000 is 1 seconde slapen, voorkomt dat je onnodig cycles verbrand met deze loop.
             // Hoe hoger de geaccepteerde maximale ideaal afwijking, hoe hoger de wachttijd en hoe minder verspilling.
    time_t huidigeTijd
    time(&huidigeTijd)

    if (huidigeTijd - startTijd > (long)aantalSecondenDatHetMagDuren)
    {
      wait = false;
    }
}

// kill, interupt, whatever je processen die moeten stoppen

//einde thread
...

Ohja en als de andere thread klaar zijn dan zet je deze natuurlijk stil of vernietig je deze. Er komt nog wel een klein beetje meer bij kijken, maar het idee zal duidelijk zijn.

  • simenon
  • Registratie: Januari 2001
  • Laatst online: 03-02-2023
De bedoeling van de watchdog is dat deze de toestanden van het state pattern controleert (in dit geval een simulatie van een simpele reactor, met de toestanden idle, opwarmen, reactie en afkoelen). De watchdog evalueert de toestand waarin de reactor zit. Afhankelijk van de toestand worden er dus verschillende eigenschappen gesteld aan de watchdog. Om te beginnen ga ik er vanuit dat de eigenschappen die de watchdog stelt voor alle toestande gelijk zijn. In dit geval is het dus dat als er langer dan 2 seconden in 1 toestand blijft de watchdog dit signaleert en de reactor vervolgens naar zijn idle toestand terugbrengt. De watchdog is een thread alsmede de reactor. Nu ben ik zover dat ik een functie heb gevonden die 2 seconden wacht maar deze werkt niet perfect.
code:
1
2
3
4
5
6
7
8
9
  void Watchdog::startWatching() {
    SetWaitableTimer(timer,TimeToWait,NULL,NULL,NULL,FALSE)
    //zie ook boek Advanced Windows Third Edition pagina 445
    reset()
  }

  void Watchdog::reset() {
    //shutdown reactor
  }

Echter roept de functie startwatching de reset niet aan en ik weet niet waarom. Of ik doe iets verkeerd of het is de verkeerde functie voor dit probleem. Iemand enig idee :?

Verwijderd

Wat je allemaal wel niet kan vinden met Google ...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Watchdog::startWatching() 
{
   SetWaitableTimer(timer,TimeToWait,NULL,NULL,NULL,FALSE)

   if (WaitForSingleObject(timer, INFINITE) != WAIT_OBJECT_0)
   {
    //Oeps ... foutje?
    ShowMessage(AnsiString("Foutje") + (String) GetLastError());
   }
   else 
   {
    //Timer signaled.
    reset()
   }  
}

WaitForSingleObject

Check pagina 22
Pagina: 1