AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TOracleQuery Threaded --> Wann Query-Objekt freigeben?
Thema durchsuchen
Ansicht
Themen-Optionen

TOracleQuery Threaded --> Wann Query-Objekt freigeben?

Offene Frage von "sirius"
Ein Thema von sirius · begonnen am 4. Mai 2010 · letzter Beitrag vom 6. Mai 2010
Antwort Antwort
Benutzerbild von sirius
sirius

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

Re: TOracleQuery Threaded --> Wann Query-Objekt freigeben

  Alt 6. Mai 2010, 15:40
So, ich habe rausgefunden, dass das Programm bei der Freigabe von TORacleQuery auch den internen Thread freigebt und vorher noch mit TThread.Waitfor auf das Ende wartet. Allerdings wurde der Thread kurz zuvor mit suspend schlafen gelegt (warum weis ich nicht).

Hier mal der Code zum selber testen:
Delphi-Quellcode:
//ein Doppelklick aufs Memo würde den Test starten

type
  TForm1 = class(TForm)
    OracleSession1: TOracleSession; //Verbindung im OI eingestellt und connected auf true; threadsafe auch auf True
    Memo1: TMemo;
    procedure OracleQueryThreadError(Sender: TOracleQuery;
      ErrorCode: Integer; const ErrorMessage: String);
    procedure OracleQueryThreadExecuted(Sender: TOracleQuery);
    procedure OracleQueryThreadFinished(Sender: TOracleQuery);
    procedure OracleQueryThreadRecord(Sender: TOracleQuery);
    procedure Memo1DblClick(Sender: TObject);
  private
    { Private-Deklarationen }
    FRecorded:Integer;
    procedure WMUser(var Msg:TMessage); message WM_User;
    procedure StartQuery;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OracleQueryThreadError(Sender: TOracleQuery;
  ErrorCode: Integer; const ErrorMessage: String);
begin
  memo1.Lines.add('Error: '+inttostr(ErrorCode)+' '+ErrorMessage);
end;

procedure TForm1.OracleQueryThreadExecuted(Sender: TOracleQuery);
begin
  memo1.lines.add('Executed');
end;

procedure TForm1.OracleQueryThreadFinished(Sender: TOracleQuery);
begin
  memo1.lines.add('Finished - '+inttostr(FRecorded)+' Records');
  postmessage(handle,WM_User,0,integer(Sender)); //start new
end;

procedure TForm1.OracleQueryThreadRecord(Sender: TOracleQuery);
begin
  inc(FRecorded);
end;

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
  StartQuery;
end;

procedure TForm1.WMUser(var Msg: TMessage);
var OracleQuery:TOracleQuery;
begin
  OracleQuery:=TOracleQuery(msg.LParam);
  //while OracleQuery.ThreadIsRunning do sleep(1); //mit der Zeile passiert es deutlich seltener, aber das ist ja auch keine Lösung
  OracleQuery.Free;
  StartQuery;
end;

procedure TForm1.StartQuery;
var OracleQuery:TOracleQuery;
begin
  FRecorded:=0;
  OracleQuery:=TOracleQuery.Create(self);
  OracleQuery.OnThreadExecuted:=self.OracleQueryThreadExecuted;
  OracleQuery.OnThreadRecord:=self.OracleQueryThreadRecord;
  OracleQuery.OnThreadFinished:=self.OracleQueryThreadFinished;
  OracleQuery.OnThreadError:=self.OracleQueryThreadError;
  OracleQuery.Threaded:=true;
  OracleQuery.ThreadSynchronized:=true;
  OracleQuery.Session:=OracleSession1;
  ORacleQuery.SQLW:='Select * from all_users';
  OracleQuery.Execute;
end;

end.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  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 14: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