AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Laufende whileschleife auf Knopfdruck unterbrechen

Ein Thema von HL92 · begonnen am 13. Feb 2015 · letzter Beitrag vom 24. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2      
HL92

Registriert seit: 7. Jan 2015
8 Beiträge
 
#1

Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 13:27
Hallo zusammen,

eigentlich dachte ich es wäre trivial aber dem scheint nicht so..
Folgende Situation:

Ich habe eine whileschleife:

Delphi-Quellcode:
while a=b and c=true
begin
..
einige anweisungen bliblablubb
..

c=PackageProcess.GetConnectstate
end
An anderer Stelle habe ich
Delphi-Quellcode:
procedure TForm_WLNConnectionNMEA.Button_DisconnectClick(Sender: TObject);
begin
  PackageProcess.SetConnectStateFalse;
  PackageProcess.DisconnectFromHost(Memo,IdTCPClient1);

end;
Jetzt zu meinem Problem:
Ich kann die whileschleife nicht per Knopfdruck beenden. Der ConnectState wird nicht aktualisiert weil ich überhaupt nicht mehr in die ButtonClick Methode reinkomme sobald die Schleife läuft.

Ich brauche also eine Möglichkeit, dass die Knopfdruckmethode höchste Priorität hat und
Sofort ausgeführt wird sobald ich den Knopf drücke. Oder gibt es eine bessere Methide?
Kann mir jemand helfen?

Geändert von HL92 (13. Feb 2015 um 13:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 13:41
Das ist etwas kompliziert:

Wenn Deine Schleife läuft ist Dein Projekt mit der beschäftigt und kommt nicht dazu, die Formularereignisse abzuhandeln. Wann soll es das auch tun?

Wenn Du das willst, musst Du dem Formular extra Rechenzeit zur Verfügung stellen. Das geht am einfachsten mit Application.ProcessMessages z.B. am Ende jeden Schleifendurchlaufs.

Das bremst natürlich die Geschwindigkeit des Schleifendurchlaufs aus. Das Projekt muss ja immer zwischendurch die Ereignisse behandeln. Manchmal ruft man das daher auch nur jeden 1000ten Durchlauf auf oder so.

Man muss natürlich auch darauf achten, dass man nichts zerstört oder verändert, was in der Schleife benutzt wird.

Besser wäre grundsätzlich, für jeden Prozess eigene Threads zu benutzen aber für den Anfang geht auch die Lösung mit ProcessMessages.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
HL92

Registriert seit: 7. Jan 2015
8 Beiträge
 
#3

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 14:00
Vielen dank für die schnelle Reaktion.
Ich hab die Anweisung Application.ProcessMessages bereits in der Schleife.

Er liest dann zwar den Status aus aber da der Knopfdruck diesen nicht verändert
sondern auf das knopfdrücken garnicht reagiert geht die Schleife direkt weiter.

Ich habe schon überlegt zu invertieren, dass ich den Status von c in der Schleife
auf false setze und dann eine Art:

"derKnopfwurdenichtgedrückt" wieder zuück.

Denkbar oder komplett umbauen und mit threads lösen?
wie kann ich das für mein Problem nutzen?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 14:09
Die Informationen sind nicht sehr aussagekräftig.

Mein Vorschlag:

Bau Dir ein kleines Demoprojekt das nur eine Schleife und einen Button zum starten und zum abbrechen implementiert.
So wird es wohl am einfachsten, die Abläufe nachzuvollziehen und zu lernen.

Wenn Du das nicht willst, dann schau zumindest mal, ob Dein ButtonClick abgearbeitet wird (Haltepunkt setzen).

Du kannst natürlich hier auch mal Dein Projekt als Zip anhängen. Aber ich denke, da wird einiges noch recht suboptimal laufen.


Mit Threads würde ich jetzt an Deiner Stelle noch nicht anfangen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 14:12
Ich würde es erst mal mit der SuFu versuchen. "schleife unterbrechen" und schon hast du eine Menge Vorschläge
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.054 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 13. Feb 2015, 14:35
Ich nehme das hier:
Code:
if GetAsyncKeyState(VK_ESCAPE) < 0 then
Exit;
Problem ist, dass man die Taste je nachdem, wie viel er in der Schleife macht, etwas länger drücken muss, bis die SChleife halt an dem Teil vorbeikommt.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 14. Feb 2015, 09:11
Ich verwende das:
Delphi-Quellcode:
Type
  TMyForm = class (TForm)
    
    Procedure ButtonAbbruchClick(Sender : TObject);
...
    FSchleifenAbbruchErwuenscht : Boolean;
    Property SchleifenAbbruchErwuenscht : Boolean Read FSchleifenAbbruchErwuenscht Write SetSchleifenAbbruchErwuenscht;
  ...
    Procedure MeineSchleife;
  end;

Procedure TMyForm.SetSchleifenAbbruchErwuenscht (value : Boolean);
begin
  ButtonAbbruch.Enabled := not Value;
  FButtonAbbruch := Value;
End;

Procedure TMyForm.MeineSchleife;
begin
  SchleifenAbbruchErwuenscht := false;
  try
    while true do begin
       Application.ProcessMessages;
       if SchleifenAbbruchErwuenscht then break;
       DoSomething();
    end;
  finally
    SchleifenAbbruchErwuenscht := false;
  end
end;

Procedure TMyForm.ButtonAbbruchClick(Sender : TObject);
Begin
  SchleifenAbbruchErwuenscht := true;
end;
Durch den Aufruf von Application.ProcessMessages wird auch der Click-Handler des ButtonAbbruch ausgeführt. Dieser zeigt nun an, das ein Schleifenabbruch erwünscht ist.
Die Schleife bekommt das mit und kann sich beenden.

Diese Property steuert gleichzeitig, ob der Button überhaupt klickbar ist.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#8

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 14. Feb 2015, 13:47
Delphi-Quellcode:
  finally
    SchleifenAbbruchErwuenscht := false;
  end
...

Diese Property steuert gleichzeitig, ob der Button überhaupt klickbar ist.
Solltest Du nicht besser im Finally-Abschnitt den Wert auf "true" setzen?

Wenn DU dort "false" setzt, dann ist der Button Enabled und signalisiert so fälschlicherweise dem Anwender, dass eine Schleife laufen würde.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 14. Feb 2015, 14:10
Dieses lässt sich insgesamt auch sehr schön generalisieren.

Eigentlich habe ich eine Aktion, die ausgeführt werden soll. Diese kann gestartet und während der Ausführung abgebrochen werden. Schön ist dann noch eine Benachrichtigung am Ende der Aktion.

Erst vor kurzem wurde hier das Command-Pattern angesprochen, dass hervorragend dazu passt:
Delphi-Quellcode:
ICommand = interface
  function CanExecute : Boolean;
  procedure Execute;
end;
Eine Aktion würde demnach so aussehen:
Delphi-Quellcode:
TActionResult = ( arCancelled, arException, arFinished );
TActionFinishedEvent = procedure ( Sender : TObject; ActionResult : TActionResult );

IAction = interface
  property StartCommand : ICommand;
  property CancelCommand : ICommand;
  property OnFinished : TActionFinishedEvent;
end;
Genau damit würde ich ansetzen. Ob die dann mit einem Thread oder eben mit Application.ProcessMessages ist erst mal schnurz (Threads wären hier aber schon die richtige Wahl).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Laufende whileschleife auf Knopfdruck unterbrechen

  Alt 14. Feb 2015, 16:15
Solltest Du nicht besser im Finally-Abschnitt den Wert auf "true" setzen?
Vermutlich. Achte mal auf die Zeit, wann ich das geschrieben habe. Da war ich -glaube ich- noch nicht einmal wach.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 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