Autor Beitrag
Trialtom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mo 11.11.02 16:38 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 11.11.02 16:57 
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?

Zitat:
wieso?

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:
ausblenden 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:
ausblenden 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.

_________________
Ist Zeit wirklich Geld?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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:
ausblenden 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


Zuletzt bearbeitet von Udontknow am Mo 11.11.02 17:05, insgesamt 1-mal bearbeitet
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 11.11.02 17:02 
du könntest auch sleep(2000); nehmen !!!

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Mo 11.11.02 22:35 
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:

ausblenden 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

ausblenden 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
ausblenden Quelltext
1:
sleep(3000);					

... auch widerum in der Schleife.

Hoffe das hat dir ein bischen weitergeholfen.

Gruß Renegade

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Trialtom Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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