Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Form Update in einem Thread (https://www.delphipraxis.net/150278-form-update-einem-thread.html)

hewy 12. Apr 2010 11:46


Form Update in einem Thread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Wollte eine Animierte Progressbar erstellen welche eine Bewegung zeigt während in meiner Applikation lange Datenbankabfragen ausgeführt werden. Habe dazu ein Beispiel von P. Below verwendet.
Funktioniert einigermassen. Allerdings hab ich folgendes Problem. Wird der Thread gestartet (Button Start) und danach die Mouse über der Main Form bewegt bleibt der Balken plötzlich stehen. Der Thread schein weiter zu laufen.
Wird ein grössere Loop gestartet tut sich kaum was am Balken. Das selbe in der Applikation wo ich dies eigentlich einsetzen will.
Hat jemanden eine Vorstellung woran das liegen könnte, oder wie dies auch anders gelöst werden könnte?
Mein Test Programm liegt bei.
Danke schon mal für jeglichen Typ.
HW

Blup 12. Apr 2010 12:20

Re: Form Update in einem Thread
 
Zugriffe auf die VCL bzw. auf Fenster die mit der VCL erstellt wurden sind aus Threads heraus unzulässig.

Variablen, die sowohl vom Thread als auch vom Hauptthread aus benutzt werden, müssen z.B. durch TCriticalSection vor gleichzeitigem Zugriff geschützt werden.

Ich würde die Datenbankzugriffe in einen Thread verlegen.
Dabei muss allerdings sichergestellt werden, daß jeder Thread für Datenbankaktionen eine eigene Datenbankverbingung nutzt.

hewy 12. Apr 2010 12:42

Re: Form Update in einem Thread
 
Hallo Blup
Danke für die Info.
Da die Applikation ziemlich umfangreich ist wäre ein verlagern der Datenbankabfragen in threads mit erheblichem Aufwand verbunden. Daher hatte ich den Weg über einen Thread gewählt. Dieser sollte eigentlich nur etwas Bewegung ins Bild bringen damit der Anwender sieht das sich etwas tut. Bin jedoch jederzeit offen für geeignetere Lösungen.
Bedeutet deine erste Aussage also das ein Thread auschliesslich Hintergrund Arbeiten ausführen kann und keinerlei updaten darf? Dann hab ich wohl den falschen Beispielcode als Ausgangslage genommen. In meinem Beispiel greift der das Hauptprogramm nicht auf Variablen des Laufenden Thread zu. Und die Bildschirmausgabe ist ja auch in einem getrennten Fenster für den Thread. Kann das dennoch so nicht verwendet werde?
Gruss
HW

mkinzler 12. Apr 2010 12:44

Re: Form Update in einem Thread
 
Tausch doch die Rollen. Die Arbeit im Hintergrund (Thread) und die Aninmation im Vordergrund.

Da die VCL nicht threadsicher ist, sollte man den Zugriff auf die Oberfläche nur im Hauptthread durchführen. Notfalls kann man die Threads ja "synchronisieren"

hewy 12. Apr 2010 12:58

Re: Form Update in einem Thread
 
Hallo mkinzler

In meinem angehängten Beispiel wird eine Popup Form (Vielleicht ist der Name TfrmProgressThread etwas missverständlich) mit Show angezeigt. Diese ist jedoch noch nicht der Thread. In dieser Form wird eine Thread Created (fAniThread) und angestossen der die Updates für ein tPanel vornimmt, den Thread übergebe ich alledings den Control der gezeichnet werden soll. Müsste ich denn durch den Thread lediglich ein event erzeugen das meinem Popup meldet das es wieder mal den Anzeigten Balken weiter schieben soll? Das könnte ich dann aber auch mit einem Timer machen.

mkinzler 12. Apr 2010 13:02

Re: Form Update in einem Thread
 
Das Zauberwort heisst TThread.Synchronize:
http://delphi.about.com/od/kbthread/a/thread-gui.htm

hewy 12. Apr 2010 13:22

Re: Form Update in einem Thread
 
Hallo mkinzler

Der Zaubertrick Synchronize (DoProgress); ist in meinem Beispiel enthalten, allerdings aus kommentiert, und gleich darunter befindet sich der unsynchronisierte aufruf (DoProgress;)
Mit Synchronize bleibt der Thread nicht mehr unvermittelt stehen, also eine Bestätigung der Richtigkeit deines Vorschlages. Allerdings wenn eine SQL Query ausgeführt wird (Im Beispiel mit einem For Loop unter dem Button ‚Run’ simuliert) bewegt sich im thread nichts, und genau das war eigentlich das ziel, das nämlich der Thread auch dann etwas macht wenn die Applikation auf die Datenbankantwort wartet. Daher weis ich troz Synchronize noch nicht was dann wirklich zu tun ist.

Nachtrag

Wenn ich in meinem Loop ein application.ProcessMessages; einfüge dann funktioniert der Ablauf unter dem Run Button sauber. Nur kann ich in einer SQL Query kein application.ProcessMessages; einfügen.

Blup 12. Apr 2010 15:04

Re: Form Update in einem Thread
 
Dann such dir Datenbankkomponenten, die von sich aus wärend auf Daten gewartet wird, ProcessMessages aufrufen.
Zur Aktualisierung genügt dann auch ein Timer.

Es gibt keine andere einfache Möglichkeit.

hewy 12. Apr 2010 15:26

Re: Form Update in einem Thread
 
Muss leider feststellen dass mein Vorhaben nicht mit vertretbarem Aufwand gemacht werden kann vielleicht überhaupt nicht. Daher hab ich mich entschieden ein Popup anzuzeigen mit einem Statischen Text ‚Daten werden geladen!’.
Danke für eure Bemühungen. Problem ist nicht gelöst sondern wird umgangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf