Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread Problem (https://www.delphipraxis.net/44836-thread-problem.html)

DerAndereMicha 25. Apr 2005 15:32


Thread Problem
 
Ich habe folgendes Problem. Ich führe innerhalb eines separaten Threads SQL-Befehle aus. Um evt. Parameter eingeben zu können, erzeuge ich eine Form zur Eingabe.

Mein Problem ist nun, daß dieses Prinzip auf allen PCs unserer Firma funktioniert, aber auf einem Server eines Kunden von uns, welcher eine Dual-Prozessor Maschine ist, nicht. Dort werden unter Umständen, die nicht nachvollziehbar sind, entweder alle Controls der Eingabeform gezeichnet oder die Form bleibt komplett leer.

Ich verwende zur Erzeugung des Threads nicht das TThread-Objekt von Delphi, sondern die Funktion BeginThread, damit steht mir die Synchronize-Methode von der ich im Zusammenhang mit solchen Fehlern schon in diversen Beiträgen gelesen habe, auch nicht zur Verfügung.

Ich hoffe jemand kann mir dieses Verhalten erklären und hat evt. auch eine Lösung parat.

Mephistopheles 25. Apr 2005 15:34

Re: Thread Problem
 
Wie synchronisierst du denn deine Threads aktuell? Critical Sections, Semaphoren, Mutanten?

DerAndereMicha 25. Apr 2005 15:41

Re: Thread Problem
 
Gar nicht, glaube ich jedenfalls. Der SQL-Befehl wird im Thread ausgeführt und wenn er beendet ist (ich frage
im Haupt-Thread den Status ab) kann ich erst wieder auf die Controls in der Hauptform zugreifen.

Vjay 25. Apr 2005 16:03

Re: Thread Problem
 
Nachdem dein Thread alle Abfragen gemacht hat, schickst du dir per PostMessage eine Nachricht zum Hauptform. In der Nachrichtenbehandlungsroutine schaltest du dann deine Komponenten wieder frei.

Evtl. musst du noch die Variable (Is?)MultiThreaded auf true schalten, da du an der VCL vorbeiprogrammierst.

DerAndereMicha 26. Apr 2005 07:23

Re: Thread Problem
 
Das Problem tritt schon vor der Abfrage auf. Das Fenster in die ich
die Parameter eingeben möchte, wird vom abgespaltenen Thread geöffnet
bevor ich die Abfrage ausgeführt wird und anscheinend nicht immer
richtig gezeichnet. Meine Frage war, warum das Fenster meistens aber
nicht immer, völlig ohne Controls erscheint.

Sanchez 26. Apr 2005 08:51

Re: Thread Problem
 
Hallo,
Die VCL ist nicht threadsicher. Wenn du aus einem anderen Thread außer dem Hauptthread auf VCL-Komponenten zugreifst kann durchaus alles funktionieren, muss aber nicht. Es ist mehr oder weniger ein Glücksspiel. Das dein Problem gerade auf einer Dual-Prozessor-Maschine auftritt ist eigentlich nachvollziehbar.

In deinem Thread solltest du nicht aufs Formular zugreifen, sondern am Schluss oder ggf. auch zwischendurch mal das Formular im Kontext des Hauptthreads aktualisieren. Den Weg hat dir Vjay schon beschrieben.

grüße, daniel

DerAndereMicha 26. Apr 2005 10:43

Re: Thread Problem
 
Das mit dem Neuzeichnen aus dem Kontext des Hauptthreads heraus schien mir ein guter und einfacher Ansatzpunkt zu sein. Ich habe es allerdings erstmal zum Test ohne Messages gemacht sondern über nen Timer der aller Sekunden schaut ob die Form assigned ist und die Form dann mittels
Repaint neuzeichnen lassen. Leider hat das nix geholfen...

Luckie 26. Apr 2005 10:44

Re: Thread Problem
 
Guck dir mal besser mein Tutorial zu Threads an: http://tutorials.luckie-online.de

DerAndereMicha 26. Apr 2005 10:48

Re: Thread Problem
 
@Lucki: Du wirsts mir sicherlich nicht glauben, aber das liegt neben mir. Ich hab es mir schon 3mal
komplett durchgelesen, finde aber keinen Ansatzpunkt :-(

Sanchez 26. Apr 2005 10:58

Re: Thread Problem
 
Zitat:

Zitat von DerAndereMicha
Das mit dem Neuzeichnen aus dem Kontext des Hauptthreads heraus schien mir ein guter und einfacher Ansatzpunkt zu sein.

Das ist nicht der springende Punkt. Du solltest aus deinem Thread heraus möglichst überhaupt nicht auf das Formular oder Komponenten des Formulars zugreifen.

Zurzeit setzt du irgendwelche Properties im Thread und bringst den Haupthread dazu das Form zu zeichnen, oder? Du solltest den Haupthread dazu bringen, die verschiedenen Properties zu setzen.

DerAndereMicha 26. Apr 2005 11:06

Re: Thread Problem
 
Verstehe ich das richtig, wenn ich in dem abgespaltenen Thread ein Formular mittels Create erzeuge und anschließend auch in diesem Thread mit ShowModal zur Anzeige bringe, führt diese Aktionen trotzdem der Hauptthread aus???

Motzi 26. Apr 2005 11:19

Re: Thread Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sanchez
Zurzeit setzt du irgendwelche Properties im Thread und bringst den Haupthread dazu das Form zu zeichnen, oder? Du solltest den Haupthread dazu bringen, die verschiedenen Properties zu setzen.

Messages sind an dieser Stelle optimal geeignet..! Messages können im Zusammenhang mit Threads überhaupt sehr praktisch sein und auch zur Synchronisierung verwendet werden. Hab mal ein kleines Beispiel-Prog mit Threads und Messages angehängt.

Luckie 26. Apr 2005 12:00

Re: Thread Problem
 
Und hier für die Runterlad-Faulen: http://www.luckie-online.de/Delphi/S...Nachricht.html ;)

DerAndereMicha 26. Apr 2005 13:46

Re: Thread Problem
 
Ich glaub ich steh auf dem Schlauch...

Wenn ich Eure Quelltexte (Danke übrigens) richtig verstehe wird doch bei Euch der Hauptthread durch ne Message dazu veranlaßt etwas auf der Hauptform zu zeichnen. Das ist ja gut und schön und funktioniert bei mir auch, allerdings kann ich auch z.B.die Caption der Hauptform direkt aus dem Thread heraus ändern (Mainform.Caption:='Test') und es funktioniert genau so.

Mein Formular (welches nicht das Hauptformular ist) und dynamisch im Thread erzeugt wird, wird aber einfach nicht komplett gezeichnet. Von welcher Form soll ich da ne Message senden und welche Form soll sie empfangen und darauf reagieren. Es gibt nur ein Showmodal im Thread und das funzt nicht.

Ich hoffe ich nerve Euch nicht allzusehr mit meiner Dummheit...

Sanchez 26. Apr 2005 13:59

Re: Thread Problem
 
Zitat:

Zitat von DerAndereMicha
Das ist ja gut und schön und funktioniert bei mir auch, allerdings kann ich auch z.B.die Caption der Hauptform direkt aus dem Thread heraus ändern (Mainform.Caption:='Test') und es funktioniert genau so.

Da kannst du aber nicht davon ausgehen, dass es immer funktioniert. Meistens funktionierts, manchmal aber nicht. Von deinem Thread aus solltest du auf gar kein Formular direkt zugreifen. Dafür ist die VCL nicht ausgelegt. Wenn dein Thread irgendein Fenster aktualisieren soll, dann sollte er eine Message an genau dieses Fenster senden.

Motzi 26. Apr 2005 20:02

Re: Thread Problem
 
Oh.. ich les gerade, dass du in einem abgespalteten Thread dynamisch eine Form erzeugst. Das solltest du unter allen Umständen vermeiden!!! Die VCL ist nicht threadsafe, und auch wenn du in deinen Threads nicht auf die Formen des jeweils andren Threads zugreifst, so weißt du trotzdem nicht, was die VCL intern macht und welche Objekte intern von allen TForm und Instanzen anderer Komponenten gemeinsam verwendet werden etc, wobei KEINE Thread-Synchronisation stattfindet.
Schlußfolgerung: VCL-Formen immer nur im Hauptthread, benötigst du zwingend ein Fenster in einem abgespalteten Thread, dann nur nonVCL!

DerAndereMicha 27. Apr 2005 07:16

Re: Thread Problem
 
Danke Euch Allen. Ich werde die Form wohl doch irgendwie versuchen aus dem Thread auszulagern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 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