Einzelnen Beitrag anzeigen

Schwarzesshaaf666

Registriert seit: 14. Apr 2006
Ort: Herford
13 Beiträge
 
#15

AW: ADO Queries per Thread aktualisieren

  Alt 27. Jan 2025, 15:44
Hier meine aktuelle, lauffähige Version des Threads, falls jemand etwas ähnliches braucht:

Delphi-Quellcode:
interface

type
  TQThread = class(TThread)
  private
    FQuery: TADOQuery;
    FDataSource: TDataSource;
    FRightsPk: Integer;
    FRecordCount: Integer;
    FIsRunning: Boolean;
    FQueryName: string;
  protected
    procedure Execute; override;

  public
    constructor Create(DataSource: TDataSource);
    destructor Destroy; override;

    property RightsPk: Integer read FRightsPk write FRightsPk;
    property RecordCount: Integer read FRecordCount write FRecordCount;
    property IsRunning: Boolean read FIsRunning write FIsRunning;
    property QueryName: string read FQueryName write FQueryName;
  end;

implementation

constructor TQThread.Create(DataSource: TDataSource);
begin
  inherited Create(True);

  FDataSource := DataSource;
  FreeOnTerminate := True;
end;

destructor TQThread.Destroy;
begin
  inherited;
end;

procedure TQThread.Execute;
begin
  inherited;

  CoInitialize(nil);

  try
    try
      FQuery := TADOQuery(FDataSource.DataSet);

      RightsPk := FDataSource.Tag;
      IsRunning := True;
      RecordCount := 0;
      QueryName := FQuery.Name;

      FQuery.Close;
      FQuery.Open;

      RecordCount := FQuery.RecordCount;
      IsRunning := False;
    except
      on Ex: Exception do
      begin
        dxMessageDlg('Fehler beim Ausführen des Query-Thead! (' + FQuery.Name + ', ' + Self.QualifiedClassName + ')' + #13#10#13#10 + 'Fehlermeldung: ' + Ex.Message + #13#10 + Ex.StackTrace + #13#10 + 'SQL: ' + FQuery.SQL.Text, mtError, [mbOK], 0);
      end;
    end;
  finally

    CoUninitialize();
  end;
end;
Um die Ergebnisse abzufragen, nutze ich das Event OnTerminate:
Delphi-Quellcode:
procedure TForm1.TerminateThread(Sender: TObject);
var
  RightsPk: Integer;
  RecordCount: Integer;
begin
  RightsPk := TQThread(Sender).RightsPk;
  RecordCount := TQThread(Sender).RecordCount;

  // Verarbeitung der Variablen
end
Ich sehe gerade, IsRunning ist hier sogar völlig überflüssig...

PS: Kann ich den ersten Beitrag nicht bearbeiten, um den Thread als "gelöst" zu markieren?
_________________
FREI STATT BAYERN

Geändert von Schwarzesshaaf666 (27. Jan 2025 um 15:47 Uhr)
  Mit Zitat antworten Zitat