Uhr umstellen und RTLeventWaitFor mit timeout

Antworten
mark.lamneck
Beiträge: 4
Registriert: Mi 23. Feb 2022, 11:47

Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von mark.lamneck »

Ich habe das folgende simple Programm das in einer Schleife mit RTLEventWaitFor auf einen timeout von 1s wartet und dann die Uhrzeit in der Konsole ausgibt. Das funktioniert auch soweit wie gewünscht, nur wenn ich die Uhr um Beispielsweise 1 Minute zurückstelle, hängt das Programm in der Funktion 1 Minute lang fest.

Gibt es eine Alternative mit der ich wirklich auf einen relativen timeout warten kann? Ich muss aber tatsächlich auf einen event oder timeout warten.

Das ganze läuft auf einem Raspberry Pi mit Debian Buster.

Code: Alles auswählen

uses
  cthreads,
  Classes, SysUtils, CustApp, syncObjs,
  Linux     

//...

  Fevent : PRTLEvent;
  
//...

  Fevent := RTLEventCreate();
  repeat
    writeln(formatDateTime('hh:MM:ss',now()));
    RTLeventWaitFor(Fevent,1000);
  until false;


PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von PascalDragon »

Das Problem ist, dass RTLEvent die Clock der intern verwendeten POSIX Condition Variable nicht von REALTIME auf MONOTONIC umstellt (warum wir das da nicht eingefügt haben, ist mir grad ein Rätsel...).

Was du machen kannst ist entweder BasicEventCreate oder gleich SyncObjs.TEvent zu nutzen oder du holst dir über 'nen Cast die Condition Variable des PRTLEvent und stellst sie selbst um...
FPC Compiler Entwickler

mark.lamneck
Beiträge: 4
Registriert: Mi 23. Feb 2022, 11:47

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von mark.lamneck »

Vielen Dank für die schnelle Antwort.

SyncObjs.Tevent und BasicEventCreate/basicEventWaitFor haben das gleiche Problem.

Über nen Codeschnipseln mit den benötigten units zum Umstellen dieser Conditionvariable wäre ich super dankbar. Ich seh zwar, dass die Definition von PINTRTLEvent in cthreads steht aber wenn ich ne Variable von dem Typ deklarieren will bekomme ich einen Compilerfehler "Identifier not found". Was ich auch nicht verstehe, da cthreads bedingungslos als erster include in meinen uses steht.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von PascalDragon »

Welche Compilerversion nutzt du? In 3.2.x und neuer sollte das eigentlich funktionieren.

Ich kann heute Abend mal schauen, dass ich dir 'nen Workaround zusammen stelle.
FPC Compiler Entwickler

mark.lamneck
Beiträge: 4
Registriert: Mi 23. Feb 2022, 11:47

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von mark.lamneck »

Ah bei mir ist die Version 3.0.0 installiert. Über einen workaround würde ich mich freuen. Vor allem weil ich dann etwas lernen kann.

Vielen Dank schon mal.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von PascalDragon »

Stellt sich raus, das wird zu komplex... Am Besten aktualisiere deinen FPC... 😕
FPC Compiler Entwickler

mark.lamneck
Beiträge: 4
Registriert: Mi 23. Feb 2022, 11:47

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von mark.lamneck »

Mit basicEventWaitFor/create und FPC in Version 3.2.0 klappt alles. Dass es mit RTLeventWaitFor nicht klappt ist aber noch ein bug?

Vielen Dank für die Hilfe

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Uhr umstellen und RTLeventWaitFor mit timeout

Beitrag von PascalDragon »

mark.lamneck hat geschrieben:
Fr 25. Feb 2022, 15:01
Mit basicEventWaitFor/create und FPC in Version 3.2.0 klappt alles. Dass es mit RTLeventWaitFor nicht klappt ist aber noch ein bug?
Das wurde damals einfach für PRTLEvent nicht umgesetzt, da es dem Bugreporter um TEvent ging (welches ja BasicEvent nutzt).
FPC Compiler Entwickler

Antworten