From 866c0521ad2d110330f7f777a2597638ecf9a308 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Sun, 26 Jun 2022 21:47:29 +0200 Subject: fix synchronization --- fhunit.pas | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/fhunit.pas b/fhunit.pas index 9078d96..6ff658d 100644 --- a/fhunit.pas +++ b/fhunit.pas @@ -62,15 +62,17 @@ type tMessPunkteUpdateThread = class(tThread) private - _besitzer: tMessPunkte; - antwort: string; - ladeProzess: tProcess; + _besitzer: tMessPunkte; + antwort: string; + ladeProzess: tProcess; beendet, - warGueltig: boolean; - nZeit: extended; - _tNum,_tAnz: longint; + warGueltig, + synchronized: boolean; + nZeit: extended; + _tNum,_tAnz: longint; procedure uebernehmen; procedure nZeitNullen; + procedure mySynchronize(aMethod: TThreadMethod); public beenden: boolean; constructor create(besitzer: tMessPunkte; tNum,tAnz: longint); @@ -394,6 +396,7 @@ begin setlength(antwort,0); if (not warGueltig) or (20*random<1) then form1.zeichnen; + synchronized:=true; end; procedure tMessPunkteUpdateThread.nZeitNullen; @@ -405,6 +408,16 @@ begin while round(_besitzer.werte[lIch].zeit*24*6) mod _tAnz <> _tNum do dec(lIch); nZeit:=_besitzer.werte[lIch].zeit + _tAnz*1/24/6; + synchronized:=true; +end; + +procedure tMessPunkteUpdateThread.mySynchronize(aMethod: TThreadMethod); +begin + synchronized:=false; + queue(aMethod); + while not beenden and not synchronized do begin + sleep(100); + end; end; procedure tMessPunkteUpdateThread.execute; @@ -453,12 +466,12 @@ begin if not beenden then begin setlength(antwort,bytesRead); - synchronize(@uebernehmen); + mySynchronize(@uebernehmen); if (nZeit<=now) or warGueltig then nZeit:=nZeit + _tAnz*1/24/6 else begin - synchronize(@nZeitNullen); + mySynchronize(@nZeitNullen); for cnt:=0 to 599 do begin if beenden then break; @@ -793,6 +806,18 @@ begin for i:=1 to length(t) do if not (t[i] in ['0'..'9']) then exit; mZ[zgMin10]:=strtoint(t) div 10; + while mZ[zgStunde]>=24 do begin + mZ[zgStunde]:=mZ[zgStunde]-24; + inc(mZ[zgTag]); + if mZ[zgTag]>30+byte(mZ[zgMonat] in [1,3,5,7,8,10,12])-(2-byte(mZ[zgJahr] mod 4 = 0))*byte(mZ[zgMonat]=2) then begin + mZ[zgTag]:=1; + inc(mZ[zgMonat]); + if mZ[zgMonat]>12 then begin + mZ[zgMonat]:=1; + inc(mZ[zgJahr]); + end; + end; + end; result:=(strtoint(t) mod 10) = 0; end; -- cgit v1.2.3-70-g09d2