AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DataSet über Thread öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

DataSet über Thread öffnen

Offene Frage von "HeikoAdams"
Ein Thema von HeikoAdams · begonnen am 13. Mai 2008 · letzter Beitrag vom 13. Mai 2008
Antwort Antwort
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

DataSet über Thread öffnen

  Alt 13. Mai 2008, 13:19
Datenbank: SQL Server • Version: 2000 • Zugriff über: ADO
Hallo,
in meiner Anwendung habe ich einige Tabellen mit >= 1000 Datensätze, weshalb ich die Datenquellen (TAdoDataSet, TAdoQuery) in einem seperatem Thread öffnen möchte. Hierfür nutze ich die selbst geschriebene Prozedur OpenDataSource

Delphi-Quellcode:
type
  TDSOpenThread = class(TThread)
  strict private
    FConnection: TAdoConnection;
    FDataSet: TDataSet;
    procedure UpdateForms;
  protected
    procedure Execute; override;
  public
    property AdoConnection: TAdoConnection read FConnection write FConnection;
    property OpenDataSet: TDataSet read FDataSet write FDataSet;
  end;

...
OpenDataSource(FrmMain.Database, DsMaster.DataSet);
...

procedure OpenDataSource(Connection: TAdoConnection; DataSource: TDataSet);
var
  OpenThread: TDSOpenThread;
begin
  OpenThread := TDSOpenThread.Create(True);
  with OpenThread do
  begin
    AdoConnection := Connection;
    OpenDataSet := DataSource;
    Resume;
  end;

  if WaitFor(OpenThread.Handle) then
    OpenThread.Free;
end;

procedure TDSOpenThread.Execute;
begin
  if FConnection.Connected
    and not FDataSet.Active then
    FDataSet.Open;
end;

function WaitFor(Event: THandle): Boolean;
begin
  Result := False;
  while not Result do
    case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
      WAIT_OBJECT_0:
        Result := True;
      WAIT_OBJECT_0 + 1:
        begin
          Application.ProcessMessages;
          if Application.Terminated then
            Exit;
        end;
    else
      RaiseLastOSError;
    end;
end;
Sobald ich jedoch eine Datenquelle mit < 100 Datensätze über diese Prozedur öffnen will, bekomme ich immer den Fehlercode 1400 "Fensterhandle ist ungültig".

Hat hier jemand ne Idee, wie ich das Problem lösen kann?

Gruß

Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: DataSet über Thread öffnen

  Alt 13. Mai 2008, 13:34
Wenn ich die Zeilen mit
Application. tritt mal wieder der von Delphi erzeugte Unit-Kommentar von TThread bezüglich Synchronisation beim Zugriff auf die VCL zu.
Fenster-Handle haben von der GDI/Win32API eine Thread-Affinität und deshalb darf nur mit diesen Fenster-Handeln im ursprünglichen (VCL-Hauptthread) gearbeitet werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#3

Re: DataSet über Thread öffnen

  Alt 13. Mai 2008, 13:39
OpenDataSource wird im Hauptthread aufgerufen und im TDSOpenThread arbeite ich nicht mit Handles. WaitFor läuft ebenfalls im Hauptthread der Anwendung und sorgt dafür, das der Bildschirm nicht einfriert, wenn der Thread länger läuft.

Ich vemute, das bei kleinen Datenmengen der Thread schon fertig ist, bevor WaitFor ausgeführt wird und das es deshalb zu der Fehlermeldung kommt. Aber wie kann ich das Verhindern?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: DataSet über Thread öffnen

  Alt 13. Mai 2008, 13:50
Wieso machst du das überhaupt. ADO kann doch beim MS SQL Server selbständig die übertragung von größeren Datenmengen in einen eigenen Thread durchführen (z.B. für Grid-Anzeige).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#5

Re: DataSet über Thread öffnen

  Alt 13. Mai 2008, 13:58
Ganz einfach: Wenn ich z.B. ein AdoDataSet mit ca. 5000 Datensätzen im Hauptthread öffne, friert während dessen die Anzeige ein und viele Kunden meinen, das Programm habe sich aufgehängt. Um das zu verhindern, wird während des Öffnen ein TAnimate angezeigt. Und damit das Animate auch unter XP ordentlich arbeitet, die (Hilfs-)Konstruktion mit dem Thread.
  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 19:17 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