summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2022-06-26 21:47:29 +0200
committerErich Eckner <git@eckner.net>2022-06-26 22:04:27 +0200
commit866c0521ad2d110330f7f777a2597638ecf9a308 (patch)
tree2d012f164ebbf2dd3b976d9b5f8fa5a8a83587a8
parent8df5418fcf2caa0613f6c4ccc694b5fb43f9ef1d (diff)
downloadFH-Wetter-866c0521ad2d110330f7f777a2597638ecf9a308.tar.xz
fix synchronization
-rw-r--r--fhunit.pas41
1 files 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;