![]() |
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. |
Re: Thread Problem
Wie synchronisierst du denn deine Threads aktuell? Critical Sections, Semaphoren, Mutanten?
|
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. |
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. |
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. |
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 |
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... |
Re: Thread Problem
Guck dir mal besser mein Tutorial zu Threads an:
![]() |
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 :-( |
Re: Thread Problem
Zitat:
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. |
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???
|
Re: Thread Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Thread Problem
Und hier für die Runterlad-Faulen:
![]() |
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... |
Re: Thread Problem
Zitat:
|
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! |
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