AGB  ·  Datenschutz  ·  Impressum  







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

Form Update in einem Thread

Ein Thema von hewy · begonnen am 12. Apr 2010 · letzter Beitrag vom 12. Apr 2010
Antwort Antwort
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
81 Beiträge
 
Delphi XE5 Enterprise
 
#1

Form Update in einem Thread

  Alt 12. Apr 2010, 12:46
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
Angehängte Dateien
Dateityp: zip threadedprogress_142.zip (8,2 KB, 15x aufgerufen)
Heinrich Wyssen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#2

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 13:20
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.
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
81 Beiträge
 
Delphi XE5 Enterprise
 
#3

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 13:42
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
Heinrich Wyssen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 13:44
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"
Markus Kinzler
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
81 Beiträge
 
Delphi XE5 Enterprise
 
#5

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 13:58
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.
Heinrich Wyssen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 14:02
Das Zauberwort heisst TThread.Synchronize:
http://delphi.about.com/od/kbthread/a/thread-gui.htm
Markus Kinzler
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
81 Beiträge
 
Delphi XE5 Enterprise
 
#7

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 14:22
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.
Heinrich Wyssen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 16:04
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.
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
81 Beiträge
 
Delphi XE5 Enterprise
 
#9

Re: Form Update in einem Thread

  Alt 12. Apr 2010, 16:26
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.
Heinrich Wyssen
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:40 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