Einzelnen Beitrag anzeigen

happyaura

Registriert seit: 12. Jan 2005
Ort: Hamburg
73 Beiträge
 
Delphi 6 Personal
 
#1

Probleme mit Timer und sleep

  Alt 17. Mai 2006, 10:04
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?
  Mit Zitat antworten Zitat