AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde
Thema durchsuchen
Ansicht
Themen-Optionen

Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

Ein Thema von freejay · begonnen am 14. Dez 2017 · letzter Beitrag vom 15. Dez 2017
Antwort Antwort
Seite 1 von 2  1 2      
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
275 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 15:47
Ich habe mir schon gedacht, dass irgendwer ProcessMessages ankritteln wird...

Aber wie könnte man denn das "ich will einen laufenden Prozess über einen Cancel-Button abbrechen lassen können" sonst lösen?

Um die Benutzung eines Cancel-Buttons zu erlauben, muss ich doch ProcessMessage verwenden, oder? Auch wenn ich den Prozess in einen anderen Thread stecke, muss ich doch auf das Ende des Threads mit ProcessMessages warten?

Und sobald ProcessMessages ins Spiel kommt, kann man halt auch den CloseButton drücken. Nur verhält sich der dann recht eigenwillig...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Wosi

Registriert seit: 29. Aug 2007
59 Beiträge
 
#2

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:05
- Lager die langläufige Routine in einen Thread aus
- Halte eine Referenz auf den Thread (Wichtig ist hierbei, dass FreeOnTerminate nicht gesetzt ist)
- Wenn Abbrechen geklickt wird, rufst du Thread.Terminate auf
- In dem Thread prüfst du regelmäßig ob Terminated gesetzt wurde
- Beim Schließen des Fensters rufst du Thread.Free auf. Damit wartest du automatisch bis der Thread auch wirklich fertig ist
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:15
[/QUOTE]
- Lager die langläufige Routine in einen Thread aus
- Halte eine Referenz auf den Thread (Wichtig ist hierbei, dass FreeOnTerminate nicht gesetzt ist)
- Wenn Abbrechen geklickt wird, rufst du Thread.Terminate auf
- In dem Thread prüfst du regelmäßig ob Terminated gesetzt wurde
- Beim Schließen des Fensters rufst du Thread.Free auf. Damit wartest du automatisch bis der Thread auch wirklich fertig ist
Ok, und wie prüfe ich jetzt im Formular, ob der Thread fertig ist?
Damit ich z.B. Buttons wieder enablen/disablen kann?
Da fällt mir nur ein TimerEvent (nicht sehr elegant) ein oder eine CallbackProzedur, die der Thread anstößt. Hm...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Wosi

Registriert seit: 29. Aug 2007
59 Beiträge
 
#4

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:19
http://docwiki.embarcadero.com/Libra...ad.OnTerminate
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:23
Jaaa, vielleicht sollte ich mir doch angewöhnen, sowas immer rein eventbasiert zu lösen. Und nicht mit lustigen "While ThreadNochLäuft ProcessMessages"-Schleifen...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:08
Das ist eine Konstellation, auf die die VCL nicht direkt ausgelegt ist.

Schau mal, ob vielleicht OnCloseQuery vorher getriggert wird. Dann könntest Du dort ein Flag setzen und dies für einen vorzeitigen Abbruch der Schleife prüfen.
Ansonsten gibt es vielleicht eine Message, die man noch abfangen kann.
Aber so etwas kann dann auf späteren Delphi-Versionen oder auf verschiedenen Windows-Versionen und -Rechnern schon wieder ganz anders laufen.

Vielleicht kannst Du Dein SubFormular ja auch durch ein Panel ersetzen, das Du einfach in Dein Hauptformular einsetzt.


Grundsätzlich ist sicher sinnvoll, solche längeren Aufgaben in Threads auszulagern. Dazu muss man dann aber auch die konkreten Zuständigkeiten der einzelnen Formulare klären...
ProcessMessages ist immer mit Vorsicht zu genießen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
275 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 16:21
Das ist eine Konstellation, auf die die VCL nicht direkt ausgelegt ist.

Schau mal, ob vielleicht OnCloseQuery vorher getriggert wird. Dann könntest Du dort ein Flag setzen und dies für einen vorzeitigen Abbruch der Schleife prüfen.
Ansonsten gibt es vielleicht eine Message, die man noch abfangen kann.
Aber so etwas kann dann auf späteren Delphi-Versionen oder auf verschiedenen Windows-Versionen und -Rechnern schon wieder ganz anders laufen.

Vielleicht kannst Du Dein SubFormular ja auch durch ein Panel ersetzen, das Du einfach in Dein Hauptformular einsetzt.


Grundsätzlich ist sicher sinnvoll, solche längeren Aufgaben in Threads auszulagern. Dazu muss man dann aber auch die konkreten Zuständigkeiten der einzelnen Formulare klären...
ProcessMessages ist immer mit Vorsicht zu genießen.
Nee, OnCloseQuery verhält sich leider genauso - das hatte ich schon ausprobiert. Ich hab das Problem ja auch nur, weil ich das Fenster modal öffnen muss, sonst geht das mit OnClose und OnCloseQuery alles problemlos.

Natürlich ist ProcessMessages irgendwie etwas Getrickse, aber ich finde, dass man in vielen (einfacheren) Fällen damit sehr gut (und problemlos) arbeiten kann, ohne einen großen Overhead für eine andere Lösung basteln zu müssen. Aber in diesem Fall geht's wohl nicht...
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.506 Beiträge
 
Delphi 12 Athens
 
#8

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 21:29
Aber wie könnte man denn das "ich will einen laufenden Prozess über einen Cancel-Button abbrechen lassen können" sonst lösen?
Genauso wie bei Threads? (Thread.Terminate und IF-Self.Terminated im Thread)

Deine Schleife muß eben auch auf die Beendigung ragieren.
Delphi-Quellcode:
while (SecondsBetween(Now,OldTime) < 10) and (ModalResult = mrNone) do
  Application.ProcessMessages;
Und das gilt nicht nur für dein modales Fenster, sonden auch für die ganze Anwendung.
Delphi-Quellcode:
while (SecondsBetween(Now,OldTime) < 10) and (ModalResult = mrNone) and not Application.Terminated do
  Application.ProcessMessages;
OnClose und OnCloseQuery werden im DoClose aufgerufen.
Buttons mit ModalResult und TForm.Close setzen eben nur den Status "Liebes Fenster, du darfst dich beenden", aber das wird eben nur/erst im ShowModal ausgewertet, wenn man ihm auch die Möglichkeit dazu gibt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Dez 2017 um 21:32 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 14. Dez 2017, 22:28
Hallo,
du kannst ein Fenster auch semimodal öffnen.
Nach aussen hin (für den Benutzer) ist es modal,
aber intern (für den Programmierer) wird es mit Show geöffnet
und man kann seine Berechnungen laufen lassen.

Und da es mit Show geöffnet wird, funktioniert z.B. auch ein Cancel-Button.

Delphi-Quellcode:
// Erzeugen
var
  WindowList : Pointer;

  Form:= TForm1.Create(nil);
  WindowList:= DisableTaskWindows(Form.Handle);
  Form.Show;
  Application.ProcessMessages;

// Freigeben
  Form.FCanClose := True;
  EnableTaskWindows(WindowList);
  Form.Free;
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.506 Beiträge
 
Delphi 12 Athens
 
#10

AW: Verrückte Eventreihenfolge, wenn Fenster mit ShowModal geöffnet wurde

  Alt 15. Dez 2017, 00:17
du kannst ein Fenster auch semimodal öffnen.
...
Dann raucht aber sein Button-Code ab, denn das Hauptproblem ist, dass der sich nicht beendet, sobald das Fenster zu gehn soll.
Also ginge das Fenster wirklich zu und würde freigegeben.

Auch in deinem Code bleibt es dann in dem ProcessMessages (nach Show) hängen, bis der Button fertig ist.
und da fehlt auch noch eine Schleife um das ProcessMessages, denn sonst rauscht es sofort bis zum Free durch (ShowModal wartet von selber) und die Form ist sofort wieder weg.

Selbst wenn das Fenster geschlossen/ausgeblendet wird, dann müsste danach dennoch bis zur Freigabe gewartet werden, bis der Button fertig ist (was in einem Thread nicht möglich ist ... klingt fast nach 'nem Deadlock).
Also ob sichtbar oder unsichtbar, gewartet werden muß immer, wenn seine Arbeitsschleife sich nicht beendet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Dez 2017 um 01:25 Uhr)
  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 16:25 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