![]() |
Zeos Connect in Thread packen
N'Abend!
Ich möchte beim Programmstart eine Zeos-Verbindung zu einer MySQL-DB herstellen. Da einige Mitarbeiter von außen zeugreifen (via VPN) möchte ich, dass mein Programm beim Programmstart die Verbindung über einen Thread aufbaut. Also habe ich die Komponentenreferenz an den Thread weitergegeben, innerhalb mit Synchronize aufgerufen und trotzdem erhalte ich einen Absturz des Programms mit der Fehlermeldung "Abstrakter Fehler". Hier mal der Quelltext:
Delphi-Quellcode:
Also, von Form1 wird die ZConnection an die Funktion ConnectToDB in die DB-Unit weitergegeben. Von dort wird die Referenz in den Thread weitergegeben.
////////////
1. MainForm //////////// if (dbData) then begin ConnectToDb(ZConnection1, true, true); end; ///////////////////// 2. Extra-DB-Unit ///////////////////// function ConnectToDb(ZConnection: TZConnection; Suppress: Boolean = false; ShowSeekForm: Boolean = false): Boolean; var SeekForm: TSeekDatabase; ConnectThread: TConnectThread; begin if not (ZConnection.Connected) then begin if (ShowSeekForm) then begin SeekForm:=TSeekDatabase.Create(nil); SeekForm.Show; SeekForm.FormStyle:=fsStayOnTop; SeekForm.Refresh; ConnectThread:=TConnectThread.Create(True); ConnectThread.Connection:=ZConnection; ConnectThread.Resume; end else ... ... ///////////////////// 3. Connect-Thread ///////////////////// TConnectThread = class(TThread) private procedure Execute; procedure ConnectToDB; public Connection: TZConnection; end; procedure TConnectThread.Execute; begin Synchronize(ConnectToDB); end; procedure TConnectThread.ConnectToDB; begin Connection.Connect; end; Nochmal der Fehler: "Abstrakter Fehler" Was mache ich falsch? Danke! |
Re: Zeos Connect in Thread packen
Die Methode Execute sollte protected sein und als override markiert werden.
|
Re: Zeos Connect in Thread packen
Neeein!
Du hast recht. Da wäre ich jetzt nie drauf gekommen... Funktioniert! Danke |
Re: Zeos Connect in Thread packen
Nochmal dazu eine Frage... (ich wollte jetzt keinen eigenen Thread hier im Forum für aufmachen).
Immer, wenn ich etwas mit Synchronize im Thread aufrufe, friert das Programm wieder ein. Das kann doch auch nicht Sinn der Sache sein, oder? |
Re: Zeos Connect in Thread packen
Zitat:
|
Re: Zeos Connect in Thread packen
Ich habe mittlerweile meinen Fehler auch gefunden. Während Synchronize arbeitet (in der VCL), friert der Thread - soweit normal. Bei mir war es so, dass das Programm seitdem komplett hing.
Tja - ich habe bis gestern gedacht, dass ich Funktionen im Synchronize aufrufen muss, die die VCL AUS DEM THREAD heraus verändern. Dabei ruft die Funktion, die mit Synchronize aufgerufen wird, eine GLEICHNAMIGE Funktion in der VCL auf. Diese gab es bei mir nicht - daher das Einfrieren! Stimmt doch so, oder? |
Re: Zeos Connect in Thread packen
Synchronize schreibt die angegebene Methode in eine Liste, setzt ein Signal und lässt den Thread schlafen. Der Hauptthread bemerkt das Signal und leert die Liste. Deine Methode ConnectToDB wird also vom Hauptthread aufgerufen, was du auch sehen kannst, wenn du dir GetCurrentThreadId ausgeben lässt.
|
Re: Zeos Connect in Thread packen
Zitat:
|
Re: Zeos Connect in Thread packen
Jedenfalls muss Synchronize eine Funktion in dem Main-Thread ausführen. Das war bei mir nicht der Fall!
|
Re: Zeos Connect in Thread packen
Routinen und Methoden gehören keinem speziellen Thread!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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