Entwickler-Ecke
Sonstiges (Delphi) - Programm anhalten
Trialtom - Mo 11.11.02 16:38
Titel: Programm anhalten
hallo,
ich habe ein Verständnisproblem!
Kann es manchmal sein, das wenn eine Schleife irgendwann im quellcode enthalten ist, das delphie als erstes die schleife ausführt und dann erst die befehle, die davor stehen? wieso.
wie kann ich dem Programm sagen, das es 2 sekunden ca. warten soll, bevor es die weiteren befehle z.b. in einen button ausführt.
schonmal danke.
tschau
AndyB - Mo 11.11.02 16:57
Titel: Re: Programm anhalten
| Trialtom hat folgendes geschrieben: |
| Kann es manchmal sein, das wenn eine Schleife irgendwann im quellcode enthalten ist, das delphie als erstes die schleife ausführt und dann erst die befehle, die davor stehen? wieso. |
Wie kommst du auf diese Idee?
Es gibt zwar eine Konstruktion in der der Code Optimierer Code aus der Schleife vor die Schleife stellt, da er sich nicht ändert, aber das ganze andersherum konnte ich noch nie beobachten.
Aus:
Quelltext
1: 2: 3: 4: 5: 6:
| // var a, b, c, i: Integer; for i := 1 to 10 do begin a := b; Inc(c); end; |
macht der Code Optimierer:
Quelltext
1: 2:
| a := b; for i := 1 to 10 do Inc(c); |
da sich a und b in der Schleife nicht ändern.
Säale
| Zitat: |
| wie kann ich dem Programm sagen, das es 2 sekunden ca. warten soll, bevor es die weiteren befehle z.b. in einen button ausführt. |
Du könntest einen Timer starten, dessen Interval 2000 ist und im OnTimer Ereignis sich wieder deaktiviert.
Udontknow - Mo 11.11.02 17:02
Hi!
Nein, sowas passiert garantiert nicht (sofern du die Finger von Threads lässt).
Manchmal kann es aber einem so vorkommen, wenn man in einer Bearbeitungsroutine den Aufruf Application.ProccessMessages hat.
Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure Form1.Button1Click(Sender:TObject); begin ShowMessage('1'); sleep(3000); Application.ProcessMessages; ShowMessage('2'); end; |
Wenn du innerhalb der drei Sekunden, die der Hauptthread wartet, noch einmal auf den Knopf drückst, so wird das Ergebnis "1,1,2,2" sein, obwohl man ja eigentlich eine Serialisierung im Sinne von "1,2,1,2" erwartet.
Cu,
Udontknow
matze - Mo 11.11.02 17:02
du könntest auch sleep(2000); nehmen !!!
Renegade - Mo 11.11.02 22:35
Titel: Re: Programm anhalten
Moin erstmal!
| Trialtom hat folgendes geschrieben: |
| Kann es manchmal sein, das wenn eine Schleife irgendwann im quellcode enthalten ist, das delphie als erstes die schleife ausführt und dann erst die befehle, die davor stehen? wieso. |
Ich denke, daß diese Phänomen bei dir auftritt, wenn du innerhalb von einer Schleife Ausgaben auf den Bildschirm bringen willst. Stimmts?
Wenn dem so ist, dann liegt es daran, daß für Delphi die Bildschirmausgabe "zweitrangig" ist. Das heißt im klartext: Delphi arbeitet die Anweisungen so schnell ab, daß nur einige wenige oder nur die letzte Ausagabe auf dem Bildschirm erscheint.
Beispiel:
Quelltext
1: 2: 3: 4:
| for i: 1 to 10 do begin Label1.caption:=IntToStr(i); end; |
In diesem Beispiel sollte nur die 10 im Label erscheinen. Delphi hat aber in der zwischenzeit alle Ausgaben abgearbeitet - nur nicht angezeigt.
Um dieses zu verhindern (bei Statusbars z.B.) mußt du den Befehl
Quelltext
1:
| Application.ProcessMessages; |
in die Schleife mit einbauen. Wenn Du zwischen den einzelnen Ausgaben noch ein bischen "warten" willst brauchst du noch den Befehl
... auch widerum in der Schleife.
Hoffe das hat dir ein bischen weitergeholfen.
Gruß Renegade
Trialtom - Fr 15.11.02 15:55
Titel: Thanks
Danke erstmal für eure Antworten. ja das mit sleep hilft wirklich.
ich hatte es bisher mit der time funktion gemacht...ziemlich umständlich und geht ab 59 bzw 60 sekunden auch nicht mehr... naja
Application.ProcessMessages; war wirklich der entscheidende befehl den ich gesucht habe, Danke noch an alle, die geantwortet haben.
Tschau
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!