![]() |
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. |
Re: schleife will einfach nicht.
Muss es denn unbedingt eine Schleife sein? Ich denke, ein Timer würde reichen
|
Re: schleife will einfach nicht.
Delphi-Quellcode:
woher weißt du das in i eine 0 steht?
procedure SchleifenThread.Execute;
var i:integer; begin while i = 0 do begin Synchronize(UpdatePing); Delay(2000); Synchronize(UpdatePong); end; end; |
Re: schleife will einfach nicht.
...und im Thread sollte es Sleep(2000) heissen und nicht Delay(2000) !!
|
Re: schleife will einfach nicht.
hm ich habs zwar nicht in delphi kompiliert aber guck dir mal deine schleife an:
Delphi-Quellcode:
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.
procedure SchleifenThread.Execute;
var i:integer; begin while i = 0 do begin Synchronize(UpdatePing); Delay(2000); Synchronize(UpdatePong); end; end; 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 |
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 ? |
Re: schleife will einfach nicht.
Zitat:
Du fügst folgenden Code beim Button ein:
Delphi-Quellcode:
SchleifenThread.Terminate; |
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.
|
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! |
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. |
Re: schleife will einfach nicht.
ohne i ist es aber viel einfacher, du machst
Delphi-Quellcode:
Und rufst dann beim Button
procedure SchleifenThread.Execute;
begin while not terminated do begin Synchronize(UpdatePing); sleep(2000); Synchronize(UpdatePong); sleep(2000); end; end;
Delphi-Quellcode:
auf
SchleifenThread.Terminate;
|
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 ;) |
Re: schleife will einfach nicht.
Zitat:
|
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 |
Re: schleife will einfach nicht.
Zitat:
|
Re: schleife will einfach nicht.
Zitat:
Delphi-Quellcode:
D.h. du musst beim Button einfach schreiben:
Thread := SchleifenThread.Create(False);
Delphi-Quellcode:
Thread.terminate;
Fertig |
Re: schleife will einfach nicht.
Liste der Anhänge anzeigen (Anzahl: 1)
Jop das wars.
So hier nochmal nen Code update |
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:
|
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 ;) |
Re: schleife will einfach nicht.
Zitat:
müsste dann ungefähr so aussehen:
Delphi-Quellcode:
nur runtergetippt & ungetestet
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; |
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; |
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 22:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz