diff options
author | Erich Eckner <git@eckner.net> | 2022-06-26 21:47:29 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2022-06-26 22:04:27 +0200 |
commit | 866c0521ad2d110330f7f777a2597638ecf9a308 (patch) | |
tree | 2d012f164ebbf2dd3b976d9b5f8fa5a8a83587a8 | |
parent | 8df5418fcf2caa0613f6c4ccc694b5fb43f9ef1d (diff) | |
download | FH-Wetter-866c0521ad2d110330f7f777a2597638ecf9a308.tar.xz |
fix synchronization
-rw-r--r-- | fhunit.pas | 41 |
1 files changed, 33 insertions, 8 deletions
@@ -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; |