Hallo...
Mein Kollege kam zu mir weil seine Datenbankanwendung zyklisch sekundenweise einfriert. Beim debuggen hab ich dann schnell herausgefunden, dass die Datenbankabfragen die Ursache dafür sind. Klarer Fall. Das muss gethreadded werden.
Doch auch mit Thread friert meine kleine Sandbox ein. Wie kann das denn angehen?
Bissl (unfertiger) Code:
Delphi-Quellcode:
type
TUpdater = class(TThread)
private
FCnx: TZConnection;
FQry: TZQuery;
FCS: TCriticalSection;
FRepository: CRepository;
FObjects: TObjectList;
FTable: String;
FKlausel: String;
destructor destroy;
protected
procedure Execute; override;
public
constructor create(CreateSuspended: Boolean);
end;
Delphi-Quellcode:
procedure TUpdater.Execute;
var Instance: TKMicsRepository;
begin
CoInitialize(nil); // Hab ich nach der Forensuche eingebaut - hat nichts bewirkt
FQry.SQL.Clear;
FQry.SQL.Add('SELECT * FROM '+FTable);
if FKlausel <> '' then
FQry.SQL.Add('WHERE '+FKlausel);
// Alles mögliche auskommentiert - friert trotzdem immernoch kurz ein...
// if Assigned(FCS) then
// FCS.Enter;
try
FQry.Open;
// FObjects.Clear;
while not FQry.Eof do // ... und zwar genau hier
begin
// Instance:=CRepository(FRepository).Create;
// Instance.readValue(FQry.Fields);
// FObjects.Add(Instance);
FQry.Next;
end;
finally
// if Assigned(FCS) then
// FCS.Leave;
end;
FQry.Close;
FCnx.Disconnect;
CoUnInitialize;
Self.Terminate;
end;
constructor TUpdater.create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FCnx:=TZConnection.Create(nil);
FCnx.Protocol:= 'firebird-2.1';
FCnx.HostName:= '192.168.200.5';
FCnx.Database:= 'c:\firebird\test2.fdb';
FCnx.User:= 'sysdba';
FCnx.Password:= 'masterkey';
FCnx.Properties.Clear;
{..}
FQry:=TZQuery.Create(nil);
FQry.Properties.Clear;
{..}
FQry.Connection:=FCnx;
end;
destructor TUpdater.destroy;
begin
freeAndNil(FCnx);
freeAndNil(FQry);
inherited Destroy;
end;
Delphi-Quellcode:
procedure TCachingTable.refresh;
var Updater: TUpdater;
begin
Updater:=TUpdater.Create(true);
Updater.FreeOnTerminate:=true;
Updater.FCS:=FCS;
Updater.FTable:=FTable;
Updater.FKlausel:=FKlausel;
Updater.FRepository:=FRepository;
Updater.FObjects:=FObjects;
Updater.Resume;
while not Updater.Finished do
Application.ProcessMessages;
if Assigned(doUpdate) then
doUpdate(self);
end;
Jemand noch ne Idee was das sein kann?
Gruß,
Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?