Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Fr 17.12.10 18:34 
Hallo zusammen!

Ich hab ein simples Testprogramm geschrieben, mit dem ich die Genauigkeit von Sleep() testen will. Foolgendermaßen siehts aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TForm1.Button1Click(Sender: TObject);
var
  vTimestamp1, vTimestamp2: Integer;
  vfile: TextFile;
  i: integer;
begin
  running := true;
  Button1.Enabled := false;
  AssignFile(vFile, '.\File.txt');
  Append(vFile);  //Datei wird als vorhanden vorausgesetzt
  i := 1;

  try
    WriteLn(vFile, 'Sleep: 1542 ms');  //Header
    while running do
    begin
      vTimestamp1 := GetTickCount;
      sleep(1542);
      vTimestamp2 := GetTickCount;
      vTimeStamp2 := vTimestamp2 - vTimestamp1;
      WriteLn(vFile, 'Diff [ms]: ', inttostr(vTimeStamp2),  #13,
        'Durchgang: ', inttostr(i));
      DurchgangEdit.Text := inttostr(i);
      DiffEdit.Text := inttostr(vTimeStamp2);
      inc(i);
    end;
  finally
    CloseFile(vFile);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Running := false;
  Button1.Enabled := true;
end;


Programm gibt keine Rückmeldung zurück, sobald es gestartet wurde. Wenn ich mit dem Debugger drüber geh, werden die einzelnen Schritte ausgeführt, aber es passiert nichts. Heisst, Button1 wird nicht disabled, es wird nichts ins File geschrieben, noch werden die Edits aktualisiert. Ich steh voll aufm Schlauch. Liegts vielleicht an der Abbruchbedingung? Wenn ja, würde mich interessieren, wie ich auf anliegende (noch nicht verarbeitete) Messages reagieren kann. Das würde mich generell interessieren :)

Danke für eure Hilfe!

Grüße Kay
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Fr 17.12.10 18:41 
Füge ein Application.ProcessMessages; an das Ende der Schleife ein.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Fr 17.12.10 18:53 
So funktionierts und sowas hab ich auch gesucht, danke :)
Ich nehm an, dass die Objekte nicht aktualisiert worden sind, weil die Events (also zum Beispiel das Eintragen und Anzeigen in die Edit-Felder) auch über Messages laufen? Oder warum kam da nichts (bzw. auch erst jetzt, wenn Application.ProcessMessages aufgerufen wird)?
Also mich interessiert da nur der Hintergrund, ich wills einfach verstanden haben :)
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 17.12.10 19:32 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Ich nehm an, dass die Objekte nicht aktualisiert worden sind, ...
Richtig erkannt.

Wenn Du in einer Procedure/Funktion eine Schleife verarbeitest, so muss erst die Schleife beendet werden bevor die Procedure/Funktion beendet wird und eine Rückmeldung geben kann bzw Dein Programm sich aktuallisiert. Solange passiert ebend nichts.
Darum in der Schleife evtl. Application.ProcessMessages, oder auslagern in einen Thread.

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 17.12.10 20:18 
Und wenn du einen Performance Counter (QueryPerformanceCounter, ...) statt des relativ ungenauen GetTickCount benutzen würdest, hättest du auch Werte, die einigermaßen realistisch sind. ;-)
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.12.10 21:53 
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 18.12.10 14:33 
Ei gude, dann hab ich das verstanden. Merkwürdig find ich, dass Zeile 8 (also Button1.Enabled := False) auch erst aktualisiert wird, wenn die erste Schleife durchgelafuen ist und ich bei ProcessMessages ankomme. Wird aber vermutlich was mit Compileroptimierung zu tun haben.

@ jaenicke: Mir reicht eine Genauigkeit der Größenordnung 100 ms. Und Hathors Link bestätigt meine Ergebnisse, dass es unter 30 ms kritischer wird, aber so eine Genauigkeit benötige ich nicht.

Vielen Dank an alle!
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 18.12.10 14:46 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Merkwürdig find ich, dass Zeile 8 (also Button1.Enabled := False) auch erst aktualisiert wird, wenn die erste Schleife durchgelafuen ist und ich bei ProcessMessages ankomme.
Das ist nicht 'merkwürdig' sonder ist so. Erst wenn Application.ProcessMessages ausgeführt wird, wird auch alles aktuallisiert :wink:
Steht dies also am Ende in der Schleife wird auch dort erst aktualisiert, wenn am Anfang in der Schleife dann dort.

user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Wird aber vermutlich was mit Compileroptimierung zu tun haben.
Glaube nicht.

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 18.12.10 15:48 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Merkwürdig find ich, dass Zeile 8 (also Button1.Enabled := False) auch erst aktualisiert wird, wenn die erste Schleife durchgelafuen ist und ich bei ProcessMessages ankomme.
Nun ja, wo erwartest du denn, dass die WM_PAINT Nachricht zum Neuzeichnen des Buttons vorher abgearbeitet wird? Ich sehe da nichts, wo das möglich wäre. :nixweiss: