![]() |
verhindern: Klick auf Titelleiste stoppt Programm
Hallo zusammen,
ist es irgendwie möglich, das "Einfrieren" des Hauptprogramms in einer Form zu verhindern, wenn man auf die Titelleiste klickt? Hintergrund ist folgender: Ich übertrage Daten zwischen PC und externer Hardware, wenn ich nun mit der Maus zum Beispiel das Fenster mit Klick auf die Titelleiste verschiebe, wird das Programm im Fenster angehalten, passiert das zu lange, erfolgt bei der externen Hardware ein Timeout, es kommt somit zu einem Protokollfehler, die Übertragung wird abgebrochen. Das Verschieben des Fensters habe ich bereits in der kritischen Phase abgefangen (TWMMoving). Klick auf die Titelleiste stoppt das Programm aber immer noch. "bsNone" möchte ich ungern nutzen. Ich könnte mir vorstellen, wenn man die Übertragungsroutine als Thread laufen läßt (eventuell sogar nur in einem OnTimer-Event ?!), dass es nicht mehr zum "Einfrieren" kommt, da fehlt mir aber noch was KnowHow. Es ist wahrscheinlich auch ein bisschen kompliziert, Daten zwischen Hauptprogramm und Thread auszutauschen. Am besten wäre eine einfache Lösung, so dass ich auch nicht mehr viel "umbauen" muss. Vielleicht halt ja jemand mal Tipps, wie ich das machen könnte. Grüße, Seven |
AW: verhindern: Klick auf Titelleiste stoppt Programm
Pack die Übertragung in einen Thread
|
AW: verhindern: Klick auf Titelleiste stoppt Programm
Zitat:
dass es mit einem Thread funktioniert, habe ich mir schon gedacht, wollte ich aber möglichst vermeiden, da mir hier noch KnowHow fehlt, ausserdem muss ich wahrscheinlich deswegen einiges umbauen, zum Beispiel Zugriff auf visuelle Komponenten wir Progressbar, Status Captions usw. während der Übertragung. Seven |
AW: verhindern: Klick auf Titelleiste stoppt Programm
ist ein bisschen Einarbeitung nötig, lohnt sich in jedem Fall, wenn Dein Code jetzt schon sauber strukturiert ist kannst Du die Statusmeldunden über synchronize weiterverwenden.
|
AW: verhindern: Klick auf Titelleiste stoppt Programm
Der Durchgriff vom Thread auf die visuellen Komponenten hat durchaus seine Tücken.
Der Hinweis im Quelltext (wenn man ein Thread-Objekt erstellt) alle Zugriffe auf die Oberfläche (HauptThread, bzw. einen anderen ThreadKontext) mittels Synchronize zu realisieren sollte man unbedingt beachten. Allerdings muss gerade vor diesem Hintergrund folgendes beachten:
Delphi-Quellcode:
Wenn jetzt der HauptThread der Anwendung blockiert ist (durch das Festhalten der TitelLeiste) dann würde in diesem Falle auch der Thread blockiert und damit haben wir hiermit keine Lösung des Problems.
procedure TFooThread.Execute;
begin while not Terminated do begin Synchronize( MainForm.Method ); // Es geht erst dann weiter, wenn die Methode komplett abgearbeitet wurde end; end; Besser ist es in so einem Fall folgendes zu verwenden:
Delphi-Quellcode:
Die Ausführung der Methode wird in eine Warteschlange gestellt und der HauptThread führt diese dann aus, wenn er wieder Zeit dafür hat. Der Thread wird aber nicht mehr blockiert.
procedure TFooThread.Execute;
begin while not Terminated do begin Queue( MainForm.Method ); end; end; |
AW: verhindern: Klick auf Titelleiste stoppt Programm
Ok, dann werde ich mich mal in Threads einarbeiten.
Danke euch beiden. Seven |
AW: verhindern: Klick auf Titelleiste stoppt Programm
@Sir Rufo
jepp, ich habe wieder mal zu kurz gedacht... |
AW: verhindern: Klick auf Titelleiste stoppt Programm
Zitat:
Oder ist das Queue(MainForm.Method) hier eine Methode welche ich noch nicht kenne? |
AW: verhindern: Klick auf Titelleiste stoppt Programm
Queue kenne ich auch nicht. Aber sollte das ein Zugriff auf das Formular sein, muss er synchronisiert werden.
|
AW: verhindern: Klick auf Titelleiste stoppt Programm
Hallo Luckie,
Ja ist schon klar. Aber in Sir Rufos Anwort werden eben diese in eine Queue geschoben. Denn der Thread macht ja eigentlich was anderes. Meiner Ansicht nach müssen diese Methoden in der Queue aber dann von einem anderen Thread abgearbeitet werden. Ansonsten wär es ja witzlos. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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