AGB  ·  Datenschutz  ·  Impressum  







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

Zeos Connect in Thread packen

Ein Thema von TheMiller · begonnen am 28. Feb 2009 · letzter Beitrag vom 1. Mär 2009
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Zeos Connect in Thread packen

  Alt 28. Feb 2009, 21:46
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!
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Zeos Connect in Thread packen

  Alt 28. Feb 2009, 22:21
Die Methode Execute sollte protected sein und als override markiert werden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Zeos Connect in Thread packen

  Alt 28. Feb 2009, 22:23
Neeein!

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

Danke
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#4

Re: Zeos Connect in Thread packen

  Alt 28. Feb 2009, 22:35
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 11:17
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 12:23
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?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 12:27
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#8

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 12:27
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.
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#9

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 13:11
Jedenfalls muss Synchronize eine Funktion in dem Main-Thread ausführen. Das war bei mir nicht der Fall!
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Zeos Connect in Thread packen

  Alt 1. Mär 2009, 13:46
Routinen und Methoden gehören keinem speziellen Thread!
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  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 17:03 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