Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Simples testprogramm schmiert sofort nach Start ab
Kay E. - Fr 17.12.10 18:34
Titel: Simples testprogramm schmiert sofort nach Start ab
Hallo zusammen!
Ich hab ein simples Testprogramm geschrieben, mit dem ich die Genauigkeit von Sleep() testen will. Foolgendermaßen siehts aus:
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); i := 1;
try WriteLn(vFile, 'Sleep: 1542 ms'); 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 - Fr 17.12.10 18:41
Füge ein Application.ProcessMessages; an das Ende der Schleife ein.
Kay E. - 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 - Fr 17.12.10 19:32
Kay E. hat folgendes geschrieben : |
| 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
jaenicke - 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. ;-)
Kay E. - 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 - Sa 18.12.10 14:46
Kay E. hat folgendes geschrieben : |
| 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.
Kay E. hat folgendes geschrieben : |
| Wird aber vermutlich was mit Compileroptimierung zu tun haben. |
Glaube nicht.
Gruss ALf
jaenicke - Sa 18.12.10 15:48
Kay E. hat folgendes geschrieben : |
| 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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!