Announcement

Collapse
No announcement yet.

Anwendung steht wenn Daten vom Server geholt werden

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

  • Anwendung steht wenn Daten vom Server geholt werden

    Hallo,

    ich hab heute gleich zwei Fragen auf einmal, vieleicht weiß ja jemand
    von euch wie die Sache in den Griff bekomme.

    1.)Problem
    Wenn ich Daten per SQL-Anweisung vom Server aus Paradox lade steht die Anwendung solange bis alle Daten beim Client sind. Alle Aktionen die
    der User dazwischen tätigt (z.B. den Explorer öffen) zerstören das
    Anwendungsfenster bis die Transaction abgeschlosen ist.

    2.)Problem
    Der User sieht auch nicht wirklich das was passiert, was mich ebenfalls sehr stört. Ich würde gerne den Ladevorgang der Daten Visuel sichtbar
    machen. Mir schwebt da natürlich ein Fortschrittsbalken vor der den Lade
    vorgang anzeigt.

    m.f.G

    jürgen

  • #2
    Hallo,

    beide Fragen hängen zusammen. Nur dann, wenn der Ladevorgang in einen separaten Thread verlagert wird, bleibt die Benutzeroberfläche weiter bedienbar, da hier der primäre Thread der VCL weiterhin ungestört die Botschaftswarteschlange der eigenen Anwendung auslesen kann.

    Für die zweite Aufgabe (Fortschrittsanzeige) muss ein <b>BDE-Callback</b> bemüht werden

    Comment


    • #3
      Danke für die rasche antwort Herr Kosch,
      aber leider habe ich null Ahnung wie das mit dem seperatem Thread
      funktionieren soll. Haben Sie eventuell ein Beispiel wie den Vorgang
      in ein solches Thread kapseln kann?

      danke im voraus

      jürgen bukoit

      Comment


      • #4
        Hallo,

        das Thema Threads sollte nur dann in Angriff genommen werden, wenn das Mindesmass an Basiswissen vorhanden ist. Erschwerend kommt hinzu, dass ein Datenbankzugriff im zweiten Thread erfolgen soll. Ich kann hier nur meine Bücher <i>Delphi Win32-Lösungen</i> <b>oder</b> <i>Client/Server-Datenbankentwicklung mit Delphi</i> empfehlen :-)

        Das folgende Beispiel demonstriert, wie eine SELECT-Abfrage über TQuery in einen zweiten Thread ausgelagert wird, damit das Hauptprogramm während dieser Zeit ungestört weiterbedient werden kann:
        <pre>
        { ************************************************** **************
        Source File Name : DBThreadMainForm3.pas
        Typ : Formular-Unit
        Autor : Andreas Kosch
        Erstellt am : 15.02.97
        Compiler : Delphi 3.0
        Betriebssystem : Windows 95
        Beschreibung : Demonstriert die SQL-Abfrage über einen
        zweiten Thread.
        Verwendet den Alias "ShareManager".
        Revisionen : 14.06.97 Test Delphi 3 Professional
        ************************************************** ************** }

        unit DBThreadMainForm3;

        interface

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

        type
        (* Das Thread-Objekt für die SQL-Abfrage *)
        TQueryKursThread = class(TThread)
        private
        { Private declarations }
        FDB : TDataBase;
        FSes : TSession;
        FQry : TQuery;
        FOwnerForm : TForm;
        FAktieID : Integer;
        curMin, // mimimaler Wert
        curMax, // maximaler Wert
        curAvg : Currency; // Durchschnittswert
        protected
        constructor Create(AOwnerForm: TForm);
        procedure Execute; override; // TThread.Execute ist abstrakt !
        procedure GetAktieID;
        end;

        TFormMain = class(TForm)
        SessionBDE: TSession;
        DatabaseBDE: TDatabase;
        TableBDE: TTable;
        DataSourceBDE: TDataSource;
        DBNavigator1: TDBNavigator;
        DBGrid1: TDBGrid;
        TableBDEID: TAutoIncField;
        TableBDEAktie: TStringField;
        TableBDEMinWert: TCurrencyField;
        TableBDEMaxWert: TCurrencyField;
        TableBDEAktuellerKurs: TCurrencyField;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        LabelMin: TLabel;
        LabelMax: TLabel;
        LabelAvg: TLabel;
        BitBtnClose: TBitBtn;
        procedure DataSourceBDEDataChange(Sender: TObject; Field: TField);
        procedure BitBtnCloseClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        private
        { Private declarations }
        SQLThrd : TQueryKursThread;
        public
        { Public declarations }
        end;

        var
        FormMain: TFormMain;

        implementation

        {$R *.DFM}

        constructor TQueryKursThread.Create(AOwnerForm: TForm);
        begin
        // TThread-Instanz im angehaltenen Zustand erzeugen
        inherited Create(True);
        FOwnerForm := AOwnerForm;
        // eigene TSession-Instanz für diesen Thread erzeugen
        FSes := TSession.Create(Application);
        FSes.SessionName := 'SesSQLThread';
        // eigene TDataBase-Instanz für diesen Thread erzeugen
        FDB := TDataBase.Create(Application);
        with FDB do begin
        SessionName := FSes.SessionName;
        DatabaseName := 'DBSQLThread';
        AliasName := 'ShareManager';
        KeepConnection := True;
        Connected := True;
        end;
        // TQuery-Instanz für diesen Thread erzeugen
        FQry := TQuery.Create(Application);
        with FQry do begin
        DatabaseName := FDB.DatabaseName;
        SessionName := FSes.SessionName;
        SQL.Add('SELECT MIN(kurs) AS kursmin, MAX(kurs) AS kursmax,');
        SQL.Add('AVG(kurs) AS kursavg FROM sm_kurs WHERE id = :MainID');
        end;
        // TThread-Objekt soll sich selbst zerstören
        FreeOnTerminate := True;
        end;

        procedure TQueryKursThread.Execute;
        begin
        while not Terminated do begin
        with FQry do begin
        Synchronize(GetAktieID);
        Params[0].AsInteger := FAktieID;
        Open;
        curMin := FQry['kursmin'];
        curMax := FQry['kursmax'];
        curAvg := FQry['kursavg'];
        Close;
        end;
        with TFormMain(FOwnerForm) do begin
        LabelMin.Caption := Format('%m', [curMin]);
        LabelMax.Caption := Format('%m', [curMax]);
        LabelAvg.Caption := Format('%m', [curAvg]);
        end;
        // Thread bis zum nächsten Aufruf schlafen legen
        MessageBeep(-1);
        Suspend;
        end;
        end;

        procedure TQueryKursThread.GetAktieID;
        begin
        with TFormMain(FOwnerForm) do
        if TableBDE.Active then
        FAktieID := TableBDEID.Value;
        end;

        procedure TFormMain.DataSourceBDEDataChange(Sender: TObject; Field: TField);
        begin
        if Assigned(SQLThrd) then SQLThrd.Resume
        end;

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

        procedure TFormMain.FormCreate(Sender: TObject);
        begin
        SQLThrd := TQueryKursThread.Create(FormMain)
        end;

        procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
        begin
        // TThread-Eigenschaft "Terminated" auf True setzen
        SQLThrd.Terminate
        end;

        end.
        </pre&gt

        Comment


        • #5
          Hallo!

          das sieht ja schlimm aus Herr Kosch. Da ich alle Ihre Bücher habe
          werde ich mir nun wohl auch die Zeit nehmen müßen die entsprechenden
          Kapitel zu lesen. Denoch vielen Dank! Wie ich hörte wollen Sie in
          kürze ein Buch über den IB 6 rausbringen, stimmt das? und wann solls
          erscheinen?

          m.f.G

          jürgen bukoit

          Comment


          • #6
            Hallo,

            das Manuskript zum neuen Buch (Arbeitstitel "InterBase 6 und IBX") ist fast fertig. Bis es jedoch in gedruckter Form erhältlich sein wird, werden noch einige Monate (September?) vergehen

            Comment

            Working...
            X