Announcement

Collapse
No announcement yet.

Thread übernimmt das laden von Querys, Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thread übernimmt das laden von Querys, Tabellen

    Hallo,

    Vorab möchte ich anmerken, daß ich noch keine Ahnung habe wie ich mein Problem mittels Threads lösen kann.
    Meine Kenntnisse über Threads sind gleich Null.
    Trotzdem will ich mich vorab informieren, da es vielleicht gar keine Lösung dafür gibt.

    Umgebung: Interbase 6.02, IBX, Delphi 5, Einsatz von IBQuerys,IBTable, in Verbindung mit Stored-Procedures;

    Da ich Formulare habe die bis an die 20 Datasources neu öffnen müssen, damit die aktuellen Daten vorhanden sind (ca. 10 davon für Updates) habe ich das Problem, das daß Öffnen des Formulares zu lange dauert (zumindest bei nicht ganz so aktuellen PC's).
    Beim Öffnen werden jedoch nur 1-2 Tabellen sofort benötigt.
    Ziel:
    Beim Öffnen übernimmt ein separater Prozess die Abarbeitung der zeitaufwendigeren Querys/Tables
    und gibt, sobald eine Query/Table abgearbeitet wurde dieses den Hauptprozess wieder frei.
    Dies passiert so lange, bis alle Querys/Tables geöffnet wurden, bzw.
    der Benutzer das Formular schliesst.
    Bei der Freigabe werden dann die daran verknüpften Objekte aktiviert.
    Sollte in dieser Phase des Ladens der Benutzer auf ein Objekt stossen, das noch keine Verbindung
    hat ist dieses deaktivert, und wird erst nach Ablauf des Threads aktiviert.
    Zusätzlich sollte es möglich sein, den Thread korrekt zu beenden, wenn der Benutzer das Formular
    vor dem Ablauf des Threads schliesst.

    Ist so etwas mit einem/mehreren Threads lösbar, bzw. wenn ja, wer kann mir dafür ein Beispiel zeigen.?

    Hubert Wohlfart
    mailto:[email protected]

  • #2
    Hallo,

    >Ist so etwas mit einem/mehreren Threads lösbar?

    Ja.

    >Wer kann mir dafür ein Beispiel zeigen?

    In meinem Buch <i>InterBase Datenbankentwicklung mit Delphi</i> stelle ich auf den Seiten 389 bis 398 (Kapitel 7) gleich 3 verschiedene Wege für das Auslagern von IBX-Abfragen in einen zusätzlichen Thread vor Der 2. Weg sieht zum Beispiel so aus.
    <pre>
    { ************************************************** **************
    Source File Name : DBThreadMainForm2.pas
    Typ : Formular-Unit
    Autor : Andreas Kosch
    Erstellt am : 22.05.2001
    Compiler : Delphi 5.01
    Betriebssystem : Windows 2000 SP1
    Beschreibung : Demonstriert die SQL-Abfrage über einen
    zweiten Thread.
    IBX 4.52
    ************************************************** ************** }

    unit DBThreadMainForm2;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Db, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, Buttons,
    IBCustomDataSet, IBDatabase;

    type
    TFormMain = class(TForm)
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    BitBtnClose: TBitBtn;
    DataSource2: TDataSource;
    DBGrid2: TDBGrid;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBDatabase2: TIBDatabase;
    IBTransaction2: TIBTransaction;
    IBDataSet1: TIBDataSet;
    IBDataSet1ID: TIntegerField;
    IBDataSet1AKTIE: TIBStringField;
    IBDataSet1WKN: TFloatField;
    IBDataSet1AKTUELLERKURS: TFloatField;
    IBDataSet1AKTUELLESKURSDATUM: TDateTimeField;
    IBDataSet2: TIBDataSet;
    IBDataSet2KURSMIN: TFloatField;
    IBDataSet2KURSMAX: TFloatField;
    IBDataSet2KURSAVG: TFloatField;
    procedure DataSource1DataChange(Sender: TObject; Field: TField);
    procedure BitBtnCloseClick(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    (* Das Thread-Objekt für die SQL-Abfrage *)

    TQueryKursThread = class(TThread)
    private
    FAktieID : Integer; // Master-Detail-Verknüpfung
    FQuery : TIBDataSet; // Handle auf TIBDataSet im Formular
    FDS : TDataSource; // Handle auf TDataSource im Formular
    procedure ShowThreadValues; // Synchronize-Methode
    protected
    procedure Execute; override; // TThread.Execute ist abstrakt !
    public
    constructor Create(Query : TIBDataSet;
    iID : Integer;
    DS : TDataSource);
    end;

    var
    FormMain: TFormMain;

    implementation

    {$R *.DFM}

    constructor TQueryKursThread.Create(Query : TIBDataSet;
    iID : Integer;
    DS : TDataSource);
    begin
    // TThread-Instanz im angehaltenen Zustand erzeugen
    inherited Create(True);
    // Aktien-ID zuweisen
    FAktieID := iID;
    // TQuery-Handle sichern
    FQuery := Query;
    // TDataSource-Handle sichern
    FDS := DS;
    // TThread-Objekt soll sich selbst zerstören
    FreeOnTerminate := True;
    // Thread soll seine Arbeit aufnehmen
    Resume;
    end;

    procedure TQueryKursThread.Execute;
    begin
    // Sonderfall: keine ID übergeben -> kein Start
    if FAktieID = 0 then
    Exit;
    FQuery.Transaction.Commit;
    FQuery.Transaction.StartTransaction;
    // Master-Detail-Beziehung der Tabellen nachbilden
    FQuery.Params[0].Value := FAktieID;
    // SQL-Abfrage starten
    FQuery.Open;
    Synchronize(ShowThreadValues);
    end;

    procedure TQueryKursThread.ShowThreadValues;
    begin
    // TDataSource-Komponente für TDBGrid aktivieren
    FDS.DataSet := FQuery;
    end;

    {----------------------------------------------------------}
    { Formular-Methoden }
    {----------------------------------------------------------}

    procedure TFormMain.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
    TQueryKursThread.Create(IBDataSet2, // TIBDataSet1ID
    IBDataSet1ID.Value, // ID-Wert der Aktie
    DataSource2); // TDataSource für TDBGrid
    end;

    procedure TFormMain.BitBtnCloseClick(Sender: TObject);
    begin
    Close
    end;

    end.
    </pre>
    Das Beispielprojekt <i>IBCSDemo.dpr</i> aus dem Kapitel 8 greift ebenfalls auf einen Thread zur Hintergrundsuche im Datenbestand über TIBSQL zurück.

    &gt;Meine Kenntnisse über Threads sind gleich Null.

    In diesem Fall kann ich mein Buch <i>Delphi Win32-Lösungen</i> empfehlen, dort kümmert sich das ganze Kapitel 8 auf 70 Seiten um Threads

    Comment


    • #3
      Vorab Danke Andreas für die schnelle Antwort!

      Ich muß den ganzen Code zuerst mal verdauen und melde mich bei Fragen nochmals.

      Hubert Wohlfart
      [email protected]

      Comment

      Working...
      X