Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads Create (https://www.delphipraxis.net/119734-threads-create.html)

XXcD 30. Aug 2008 21:17


Threads Create
 
Hallo,
ich versuche gerade mein Programm auf mehrere Dateien auszulagern(der übersichtlichkeit halber).
Nun habe ich aber das Problem, dass ich in einer Datei meinen SQL Zugang erstelle und in einer anderen auch auf die Komponenten zugreifen muss.
Wenn ich jetzt in beiden Dateien .Create ausführe verbindet das Programm sich zweimal zu dem MySQL Server.
Also in etwa so:

Haupt.pas
Delphi-Quellcode:
uses
SQL;
...
var
  SQL: TSQL;
...
SQL:= TSQL.create;
zweite.pas
Delphi-Quellcode:
uses
SQL;
...
var
  SQL: TSQL;
...
SQL:= TSQL.create;
...
SQL.FMysql.Free;
SQL.FResult.free;
SQL.pas
Delphi-Quellcode:
  type
  TSQL = class(TThread)
    FMysql: TMysqlClient;
    FResult: TMysqlResult;
   constructor create;
  private
  public
  end;
...
constructor TSQL.Create;
begin
inherited Create;
FMysql := TMysqlClient.create;
  with FMysql do
  begin
  // Eigenschaften setzen
  Host := 'example.de';
  port := 3306;
  user :='root';
  password := 'pw';
  Db := Functions.readconfig('db');
    if Connect then
     begin
    Functions.WriteLog('MySQL Verbindung aufgebaut');
     end
  else
  begin
    Functions.WriteLog('Fehler, MySQL Server nicht verbunden');
  end;
  end;
end;
Wie kann ich nun in beiden Dateien SQL benutzen ohne, dass es zweimal erstellt wird?
Und ja ich habe mich schon mit Threads beschäftigt, aber hier hänge ich jetzt leider fest :(

mr2 30. Aug 2008 22:48

Re: Threads Create
 
Hallo,

eine Möglichkeit wäre Deine SQL-Klasse als Singleton zu implementieren, dass heißt die Klasse bekommt eine Klassenmethode welche Dir immer die selbe Instanz zurückliefert, mit der Du dann arbeiten kannst:
Delphi-Quellcode:
type
  TSQL = class
  public
    class function GetInstance: TSQL;
  end;

implementation

var
  _Instance: TSQL;

class function TSQL.GetInstance: TSQL;
begin
  if (_Instance = nil)
  then _Instance := TSQL.Create;
  Result := _Instance;
end;
Wenn Du allerdings mit zwei verschiedenen Threads auf eine Datenbank zugreifen willst, bleibt Dir nichts anderes übrig, als zwei Verbindungen zu öffnen, da die meisten DBMS nicht mit überlappenden Zugriffen von mehreren Threads klar kommen.

mr2

XXcD 30. Aug 2008 22:54

Re: Threads Create
 
Ja ich möchte eigentlich nur in einer Unit FMysql Freigeben, das geht ja eigentlich so: SQL.FMysql.Free;
Und dafür muss ich ja den gleichen Thread in der Unit benutzen wie den der in der anderen Unit erstellt wurde.
Da muss es doch eine ganz einfache möglichkeit geben, ich bin ja sicherlich nicht der erste der von mehreren Units aus auf einen Thread zugreifen muss.

Luckie 31. Aug 2008 00:05

Re: Threads Create
 
Zitat:

Zitat von XXcD
Nun habe ich aber das Problem, dass ich in einer Datei meinen SQL Zugang erstelle und in einer anderen auch auf die Komponenten zugreifen muss.

Dann stimmt das Design nicht.

mr2 2. Sep 2008 21:34

Re: Threads Create
 
jeder Thread sollte immer nur genau die Verbindung(en) freigeben, die er auch erstellt hat

mr2


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