AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [gelöst] Applikation friert ein bei Datenbankzugriff trotz Thread
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] Applikation friert ein bei Datenbankzugriff trotz Thread

Ein Thema von Tonic1024 · begonnen am 25. Aug 2011 · letzter Beitrag vom 26. Aug 2011
Antwort Antwort
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#1

[gelöst] Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 16:40
Datenbank: Firebird • Version: 2.1 • Zugriff über: Zeos 7
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?

Geändert von Tonic1024 (26. Aug 2011 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 16:50
Delphi-Quellcode:
  while not Updater.Finished do
    Application.ProcessMessages;
Ein Thread und ProcessMessages? Das sieht zumindest ungewöhnlich aus. Wie wäre es denn mit synchronisierten Events?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 16:55
Naja, er soll ja ausschließlich die Usereingaben weiter ausführen. Ich hielt das für zweckmäßig. zu syncen gibts da nix. Es geht während er läuft (also zwischen Resume und Terminate) nix rein und nix raus.

[Edit]
Es geht mir nur darum während eines Datenbankzugriffs im Frontend Scrollbars bedienen zu können. In meiner Sandbox hab ich eine Combobox mit 200 Einträgen, die ich mit der Maus hoch und runter scrolle.
[/Edit]
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?

Geändert von Tonic1024 (25. Aug 2011 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 17:28
Es geht darum, daß man in fremden Threads auf keine VCL-Dinge zugreift (außer man synchronisiert diese Zugriffe in den Hauptthread)

Und ProcessMessages hat in Threads sowieso nichts zu suchen.
$2B or not $2B
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 17:30
Delphi-Quellcode:
while not Updater.Finished do
    Application.ProcessMessages;
das lass mal besser weg und reagiere auf das onThreadTerminate-Ereignis
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von defede
defede

Registriert seit: 10. Aug 2006
Ort: Stötten am Auerberg
72 Beiträge
 
Delphi 7 Professional
 
#6

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 25. Aug 2011, 19:11
Hi,
du gehst die Datenmenge ja einmal komplett durch?
Naja ich würde nach dem Open in dem Fall erstmal ein First machen vll hilft das?
Amsonsten fallen mir nur noch sowas wie Events ein die dran hängen
oder sowas wie CalcFields, weiss leider nicht wie dein FQry aussieht.
Delphi-Quellcode:
    while not FQry.Eof do// ... und zwar genau hier
     begin
 // Instance:=CRepository(FRepository).Create;
 // Instance.readValue(FQry.Fields);
 // FObjects.Add(Instance);
       FQry.Next;
     end;
Invader Zim
Obey Zim
Fear Zim
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#7

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 26. Aug 2011, 08:48
Guten Morgen.

@himitsu: Das ist nicht IM Thread sondern eher außen herum in der GUI.

Hab das gestern nicht mehr geschafft auszuprobieren. Aber mit onTerminate klappts. Vielen Dank für den Hinweis. Unter D7 war das nie ein Problem. Ist das neu?

Gruß,

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 26. Aug 2011, 09:06
Du darfst bei Threads nicht wie üblich die (bzw. bestimmte) Felder im constructor initialisieren, sondern du darsft das erst in Execute. Hier geht es hauptsächlich um die DB-Kompos.

VErsuch dir folgende Strucktur anzugewöhnen:
Delphi-Quellcode:
procedure Tupdater.execute;
begin
  ConInitialize(nil);
  myConnection:=TxyzConnection.Create(...);
  myQuery:=...
  try
    eigentlicher_Thread_execute;
  finally
    myQuery.free;
    myConnection.free;
    coUninitialize;
  end;
end;
procedure Tupdater.eigentlicher_thread_execute;
begin
  ...
end;
Edit: Und die letzten 4 Zeilen in Refresh nimmst du bitte auch raus und löst das anders!
Es gibt z.B. das Ereignis onTerminate, dass du zuweisen kannst (auf doUpdate).
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.

Geändert von sirius (26. Aug 2011 um 09:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#9

AW: Applikation friert ein bei Datenbankzugriff trotz Thread

  Alt 26. Aug 2011, 09:17
Edit: Und die letzten 4 Zeilen in Refresh nimmst du bitte auch raus und löst das anders!
Es gibt z.B. das Ereignis onTerminate, dass du zuweisen kannst (auf doUpdate).
Das war auch das Problem, wie ich oben geschildert hab. Und weil ich immer gern verstehe warum Dinge so sind wie sie sind, hatte ich nach dem Warum gefragt.

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?

Geändert von Tonic1024 (26. Aug 2011 um 09:24 Uhr)
  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 15:48 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