Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zeos Connect in Thread packen (https://www.delphipraxis.net/129970-zeos-connect-thread-packen.html)

TheMiller 28. Feb 2009 20:46


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:
////////////
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;
Also, von Form1 wird die ZConnection an die Funktion ConnectToDB in die DB-Unit weitergegeben. Von dort wird die Referenz in den Thread weitergegeben.

Nochmal der Fehler: "Abstrakter Fehler"

Was mache ich falsch?

Danke!

Apollonius 28. Feb 2009 21:21

Re: Zeos Connect in Thread packen
 
Die Methode Execute sollte protected sein und als override markiert werden.

TheMiller 28. Feb 2009 21:23

Re: Zeos Connect in Thread packen
 
Neeein!

Du hast recht. Da wäre ich jetzt nie drauf gekommen... Funktioniert!

Danke

TheMiller 28. Feb 2009 21:35

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?

Bernhard Geyer 1. Mär 2009 10:17

Re: Zeos Connect in Thread packen
 
Zitat:

Zitat von DJ-SPM
Immer, wenn ich etwas mit Synchronize im Thread aufrufe, friert das Programm wieder ein. Das kann doch auch nicht Sinn der Sache sein, oder?

Ist es aber. Alles was per Synchronize aufgerufen wird erfolgt im Hauptthread der Anwendung. Und dort arbeitet auch deine GUI.

TheMiller 1. Mär 2009 11:23

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?

Apollonius 1. Mär 2009 11:27

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.

gsh 1. Mär 2009 11:27

Re: Zeos Connect in Thread packen
 
Zitat:

Zitat von DJ-SPM
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?

Nein das stimmt nicht. Es muss keine gleichnamige funktion in deinem Hauptthread geben. Ich glaub eher das deine Anwendung im Synchronize fest hing.

TheMiller 1. Mär 2009 12:11

Re: Zeos Connect in Thread packen
 
Jedenfalls muss Synchronize eine Funktion in dem Main-Thread ausführen. Das war bei mir nicht der Fall!

Apollonius 1. Mär 2009 12:46

Re: Zeos Connect in Thread packen
 
Routinen und Methoden gehören keinem speziellen Thread!


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