Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi schleife will einfach nicht. (https://www.delphipraxis.net/109567-schleife-will-einfach-nicht.html)

opfer15 3. Mär 2008 18:10


schleife will einfach nicht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ich hab folgende Aufgabe:

Schreibe ein Programm, das ein Ping und ein Pong; ausgibt. Diese beiden Prozesse sollen im
Wechselabstand von je zwei Sekunden auf dem Bildschirm dargestellt werden. Hierbei ist die
Computersprache frei wählbar.

Ich hab es bereits in Bat gelöst, da war es auch sau einfach, aber jez wollt ich das in Delphi realisieren und da kamen dann die Probleme.

Und zwar sieht das derweil wie folgt aus.

Ich habe versucht, meine endlosschleife, die ich ja laut aufgabenstellung brauche, in einen extra Thread zu packen. Nehm ich die schleife raus, funktioniert das Program auch, doch ist die Schleife aktiv hört der ganze spass beim delay auf.

Fussball-Robby 3. Mär 2008 18:20

Re: schleife will einfach nicht.
 
Muss es denn unbedingt eine Schleife sein? Ich denke, ein Timer würde reichen

dominikkv 3. Mär 2008 18:21

Re: schleife will einfach nicht.
 
Delphi-Quellcode:
procedure SchleifenThread.Execute;
var
i:integer;
begin
while i = 0 do
  begin
  Synchronize(UpdatePing);
  Delay(2000);
  Synchronize(UpdatePong);
  end;
end;
woher weißt du das in i eine 0 steht?

thkerkmann 3. Mär 2008 18:23

Re: schleife will einfach nicht.
 
...und im Thread sollte es Sleep(2000) heissen und nicht Delay(2000) !!

alleinherrscher 3. Mär 2008 18:24

Re: schleife will einfach nicht.
 
hm ich habs zwar nicht in delphi kompiliert aber guck dir mal deine schleife an:

Delphi-Quellcode:
procedure SchleifenThread.Execute;
var
i:integer;
begin
while i = 0 do
  begin
   Synchronize(UpdatePing);
   Delay(2000);
   Synchronize(UpdatePong);
  end;
end;
Was passiert? Es macht Ping, dann schläft er 2 sekunden, dann macht es Pong und sofort danach wieder Ping. Bau mal nach dem UpdatePong noch mal ein delay(2000) ein.
Dann solltest du nicht while i=0 setzen sondern besser while not terminated.


Apropos delay(2000): Das is ja ne riesige Funkiton...wäre es nicht einfacher, sleep(2000) zu benutzen ;)

Als im grunde sollte das meiner meinung nach so aussehen:

Delphi-Quellcode:
procedure SchleifenThread.Execute;
begin
while not terminated do
  begin
     Synchronize(UpdatePing);
     sleep(2000);
     Synchronize(UpdatePong);
     sleep(2000);
  end;
end;

Grüße

opfer15 3. Mär 2008 18:41

Re: schleife will einfach nicht.
 
Joah mit sleep hat sich das PRob. in wohlgefallen aufgelöst ^^ Das Delay hatte ich da noch drinne, weil ich das vorher ohne den extra thread hatte. Da das Fenster einzufrieren während ich Captions ändere, naja nicht sehr sinnvoll.

Das i=0 ist, ist einfach dafür da, dass die schleife ewig läuft, bis ich mit meinem Stop-Button i=1 setze. Wer dann wohl doch nochmal i=0 vor die schleife schreiben, sonst könnt ich das Program ja auch nur einmal Pro aufruf starten.

Wenn ich while not terminated schreiben würde, wie könnt ich die schleife dann mit einem button beenden ?

alleinherrscher 3. Mär 2008 18:43

Re: schleife will einfach nicht.
 
Zitat:

Zitat von opfer15
Wenn ich while not terminated schreiben würde, wie könnt ich die schleife dann mit einem button beenden ?


Du fügst folgenden Code beim Button ein:

Delphi-Quellcode:
 

SchleifenThread.Terminate;

sirius 3. Mär 2008 18:44

Re: schleife will einfach nicht.
 
Indem du Schleifenthread.Terminate aufrufst. Wie hättest du es denn mit dem i gemacht? Das terminated ist ja genau der Grund für deine Aktion.

dominikkv 3. Mär 2008 18:46

Re: schleife will einfach nicht.
 
du hast i in der prozedur deklariert, dh du kannst außerhalb der prozedur auf i nicht zugreifen!
und außerdem sind lokale variablen nicht iniziiert, dh in i steht ein zufälliger wert der nicht 0 sein muss!

opfer15 3. Mär 2008 18:58

Re: schleife will einfach nicht.
 
Also gelöst ist es jetzt geht es nur um schönheit. i hab ich in Unit 1 in public getan, sodass ich auch im Thread zugriff drauf habe. Dann am begin von Schleifenthread.execute i:= 0 und im Stop button i := 1 gesetzt. So läuft es ja. Nun nochmal die Version mit terminate versuchen.

E: Terminate ist aus der Klasse TApplication und die hab ich nicht in der free version. Es läuft und ich denk ich lass es so.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz