Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eva
Beiträge: 11
Registriert: Di 7. Aug 2012, 10:17

Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Beitrag von Eva »

Hallo zusammen,

hier nochmal eine Timer-Frage.
Wenn ich den TTimer nicht benutzen will, sondern stattdessen GetTickCount und repeat until, so wie hier ungefähr (es sollen 3 mal hintereinander 3 Zeiten gemessen und ausgegeben sowie eine Bild ein- und ausgeblendet werden):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  nochmehr;
end;
 
procedure TForm1.nochmehr;
begin
  repeat
    mehr;
  until y=3;
    Label1.Caption:='Ende.';
end;
 
procedure TForm1.mehr;
begin
 
  t1:=GetTickCount;
  x:=0;
  Inc(y);
 
  repeat
    t2:=GetTickCount;
  until (t2-t1)>=800;
    tdiff[y]:=(t2-t1);
    Inc(x);
    Form1.Caption:='Nr. '+IntToStr(x)+' / Zeit: '+IntToStr(tdiff[y]);
    Label1.Caption:=IntToStr(tdiff[y]);
    Image1.Visible:=True;
 
  repeat
    t3:=GetTickCount;
  until (t3-t2)>=900;
    tdiff[y]:=(t3-t2);
    Inc(x);
    Form1.Caption:='Nr. '+IntToStr(x)+' / Zeit: '+IntToStr(tdiff[y]);
    Label1.Caption:=IntToStr(tdiff[y]);
    Image1.Visible:=False;
 
  repeat
    t4:=GetTickCount;
  until (t4-t3)>=1000;
    tdiff[y]:=(t4-t3);
    Inc(x);
    Form1.Caption:='Nr. '+IntToStr(x)+' / Zeit: '+IntToStr(tdiff[y]);
    Label1.Caption:=IntToStr(tdiff[y]);
    Image1.Visible:=True;
 
end;


Warum seh ich dann auf der Programmleiste genau das, was ich sehen will (nämlich, dass sich alle paar 100 Millisekunden etwas ändert - aber das Label verändert sich nicht und das Bild bleibt ebenfalls unsichtbar - bis das Ende der Schleife erreicht ist: Der Endstand ist so, wie er sein soll ...

Jemand eine Idee?

Vielen Dank und viele Grüße,
Eva

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Beitrag von m.fuchs »

Solange dein COde durchläuft, ist der Thread blockiert. Und die LCL kann keine Zeichenoperationen vornehmen. Wenn du innerhalb deines repeat...until ein

Code: Alles auswählen

Application.ProcessMessages;
einfügst, dann klappt es. Dadurch wird die Arbeit kurz an die GUI übergeben, die auf alle Nachrichten (dazu gehören auch die anstehenden Zeichenoperationen) reagiert und diese abarbeitet.

ABER, für dich wichtig: Wie lange dieses Abarbeiten dauert, kann man nicht vorhersagen. Vielleicht einige Millisekunden, vielleicht sogar Sekunden, wer weiß.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Eva
Beiträge: 11
Registriert: Di 7. Aug 2012, 10:17

Re: Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Beitrag von Eva »

Das ist ja schonmal fantastisch - hab lange rumprobiert ...

Danke!!

Vielleicht noch was anderes: Mal angenommen, ich benutze doch den TTimer für einen ähnlichen Ablauf. In einer 'TForm1.FormKeyDown' Prozedur leg ich fest, dass zwei verschiedene Tasten gedrückt werden können, wenn das Bild erscheint, woraufhin je ein anderer Ton zu hören ist.

Eine dritte Möglichkeit soll sein, keine Taste zu drücken: Das Programm soll z.B. 500 ms auf einen Tastendruck warten und wenn keiner kommt, dann einen dritten Ton abspielen und weitermachen.

Wie mach ich das mit einem (zwei?) Timern?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Beitrag von m.fuchs »

Ganz einfach, du setzt den zweiten Timer auf 500 ms und startest ihn. Beim OnTimer spielst du den dritten Ton ab und startest den nächsten Durchlauf.
Wenn eine der beiden Tasten gedrückt wird, setzt du die Enabled-Property vom Timer einfach auf false.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Timing mit 'repeat until' - warum seh ich nur die Hälfte?

Beitrag von mschnell »

Eva, probier' auch 'mal den "Test", den ich in Deinem anderen Thread beschrieben habe.

-Michael

Antworten