Delphi-PRAXiS

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.

Fussball-Robby 3. Mär 2008 19:01

Re: schleife will einfach nicht.
 
ohne i ist es aber viel einfacher, du machst

Delphi-Quellcode:
procedure SchleifenThread.Execute;
begin
while not terminated do
  begin
     Synchronize(UpdatePing);
     sleep(2000);
     Synchronize(UpdatePong);
     sleep(2000);
  end;
end;
Und rufst dann beim Button
Delphi-Quellcode:
 SchleifenThread.Terminate;
auf

alleinherrscher 3. Mär 2008 19:04

Re: schleife will einfach nicht.
 
Das Problem ist eben, dass du so nicht den Überblick behälst. Die Funktion Terminate ist ja genau dazu da, den Thread abzubrechen :) Also warum wirres Zeug programmieren, wenns schon vordefinierten Code dafür gibt :) Abgesehen davon würd ich dann eher ne Boolsche Variable nehme anstatt nem Interger i...aber vergiss das am besten wieder :)

Schönen abend noch!

@Fussball-Robby: steht doch oben schon ;)

Fussball-Robby 3. Mär 2008 19:05

Re: schleife will einfach nicht.
 
Zitat:

Zitat von alleinherrscher
@Fussball-Robby: steht doch oben schon ;)

Ich weiß, wollte ihn nur nochmal darauf hinweisen und hab dann ausversehen das quote weggemacht :wink:

opfer15 3. Mär 2008 19:08

Re: schleife will einfach nicht.
 
Wie gesagt TApplication kennt er nicht ;) Ich weiss ja selber das es verwirrend ist.

Oder mach ich da nur was falsch ;) Luckys Thread PDF hat mir für heute das Hirn ausgeknipst :P

Fussball-Robby 3. Mär 2008 19:10

Re: schleife will einfach nicht.
 
Zitat:

Zitat von opfer15
Oder mach ich da nur was falsch ;)

Kann ich dir leider nicht sagen, da ich nicht weiß, was du machst :wink: in bischen code wär nicht schlecht

alleinherrscher 3. Mär 2008 19:12

Re: schleife will einfach nicht.
 
Zitat:

Zitat von opfer15
Wie gesagt TApplication kennt er nicht ;) Ich weiss ja selber das es verwirrend ist.

Oder mach ich da nur was falsch ;) Luckys Thread PDF hat mir für heute das Hirn ausgeknipst :P

Du nennst deinen Schleifenthread in Form1 ja auch so:

Delphi-Quellcode:
Thread := SchleifenThread.Create(False);
D.h. du musst beim Button einfach schreiben:

Delphi-Quellcode:
Thread.terminate;

Fertig

opfer15 3. Mär 2008 19:28

Re: schleife will einfach nicht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jop das wars.

So hier nochmal nen Code update

bluesbear 3. Mär 2008 19:56

Re: schleife will einfach nicht.
 
Das mit Threads lösen zu wollen ist IMHO ein unnötiger overkill. Ein einfacher Timer tut das viel besser. Finde ich. Also so würde ich das machen. Nur sone idee... :stupid:

opfer15 3. Mär 2008 20:28

Re: schleife will einfach nicht.
 
Na dann zeig mal her :D

Wenn ich nen Timer benutzt hab, hat sich das Prog warum auch immer verabschiedet, oder er hat die Befehle nicht abgearbeitet. Naja aber hauptsache es läuft ;)

Fussball-Robby 4. Mär 2008 14:37

Re: schleife will einfach nicht.
 
Zitat:

Zitat von bluesbear
Das mit Threads lösen zu wollen ist IMHO ein unnötiger overkill. Ein einfacher Timer tut das viel besser. Finde ich. Also so würde ich das machen. Nur sone idee... :stupid:

Hab ich doch am Anfang schon gesagt :roll:

müsste dann ungefähr so aussehen:
Delphi-Quellcode:
Var i:integer=0;

[..]

implementation

Procedure Timer1Timer(Sender:TObject);
begin
if i=0 then
  begin
    Label1.Caption:='Ping';
    inc(i);
  end else
  begin
    Label1.Caption:='Pong';
    Dec(i);
  end;
end;
nur runtergetippt & ungetestet

DeddyH 4. Mär 2008 14:49

Re: schleife will einfach nicht.
 
Ich würde das eher so machen:
Delphi-Quellcode:
type
  TPingForm = class(TForm)
    ...
    private
      IsPing: Boolean;
    ...
  end;

procedure TPingForm.PingTimerTimer(Sender: TObject);
const sPing: array[Boolean] of String = ('Pong','Ping');
begin
  IsPing := not IsPing;
  Label1.Caption := sPing[IsPing];
end;

Fussball-Robby 4. Mär 2008 14:56

Re: schleife will einfach nicht.
 
Vom Prinzip her das gleiche, aber besser :wink:
Sitz hier nur grade in Informatik und langweile mich, hatte keine Lust, mir was besseres zu überlegen :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.

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