Hallo,
ich habe ein problem mit einem Timer in kombination mit sleep. Aus meinem Programm hab ich mal ein paar Zeilen seperiert, bei denen das Problem genau so auftritt:
Delphi-Quellcode:
type Tsensor = record kanal,
wert : integer;
lab : Tlabel;
End;
var
sensor : Array[1..2] of Tsensor;
Delphi-Quellcode:
procedure TForm1.onTimer(Sender: TObject);
var i:integer;
begin
timer.Enabled:=false; //damit der Timer sich nicht selbst überholt, bzw in 2 instanzen läuft.
for i:= 1 to 2 do
begin
//sende anfrage an einen sensor, messdaten zu erstellen
sleep(200); // warte bis sensor wert gewandelt hat
inc(sensor[i].wert); // simuliertes auslesen des Sensors
sensor[i].lab.caption:=inttostr(sensor[i].wert); // ausgabe
sleep(500) // <- auch dieses sleep würde nicht das bewirken, was ich vermutet hätte,
// ist aber nur für testzwecke
if(sensor[i].lab.Font.Color=clred) then //farbe toggeln um 2 gleiche meßwerte auseinander zu halten.
sensor[i].lab.Font.Color:=clblack
else
sensor[i].lab.Font.Color:=clred;
end;
timer.Enabled:=true; //bereit für neue timer interrupts
end;
dieser Programmcode hat zur folge, dass beide Labels gleichzeitig ihren Wert und ihre Farbe ändern, vermutet hätte ich aber eine reihenfolge wie:
label 1 wird hochgezählt
500 ms
label 1 wird rot
200ms
label 2 wird hochgezählt
500ms
label 2 wird rot
200ms
label 1 wird hochgezählt,
500ms
label 1 wird schwarz
...
woran liegt das? bin ich nur zu doof das zu verstehen? mir kommt es so vor, als ob alle sleeps aufsummiert werden und ans ende der onTimer Prozedur gepackt werden.
ach ja, bei mir läuft der Timer mit 100ms, was in diesem programm wenig sinn macht, aber in dem eigentlichen schon, da die sensoren nur abgefragt werden sollen, wenn sie wirklich dran sind. dafür auch das timer.enabled=true oder false. muß ich mich überhaupt von hand drum kümmern, dass onTimer nicht doppelt aufgerufen wird oder macht das delphi von alleine?