![]() |
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:
zweite.pas
uses
SQL; ... var SQL: TSQL; ... SQL:= TSQL.create;
Delphi-Quellcode:
SQL.pas
uses
SQL; ... var SQL: TSQL; ... SQL:= TSQL.create; ... SQL.FMysql.Free; SQL.FResult.free;
Delphi-Quellcode:
Wie kann ich nun in beiden Dateien SQL benutzen ohne, dass es zweimal erstellt wird?
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; Und ja ich habe mich schon mit Threads beschäftigt, aber hier hänge ich jetzt leider fest :( |
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:
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.
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; mr2 |
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. |
Re: Threads Create
Zitat:
|
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