AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeos MySQL - Thread

Ein Thema von Zerolith · begonnen am 3. Sep 2003 · letzter Beitrag vom 4. Sep 2003
Antwort Antwort
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#1

Zeos MySQL - Thread

  Alt 3. Sep 2003, 09:31
Hallo!

ich arbeite seit einiger Zeit mit den Zeos Komponenten. Für ein etwas größeres Projekt gefällt mir das "hängen" der Anwendung nicht.

habe mich bereits versucht - allerdings funktioniert das nicht ganz (und ehrlich gesagt habe ich auch noch nicht viel mit Threads gearbeitet)

wäre super wenn mir jmd. helfen könnte das ganze zu realisieren. Muss dohc möglich sein.

Delphi-Quellcode:
unit mysqldb;

interface

uses Windows, Forms, Messages, SysUtils, Variants, Classes, Graphics, Controls,
     DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon;

type TMySQL = class(TThread)
    Database: TZMySqlDatabase;
    Transact: TZMySqlTransact;
       Query: TZMySqlQuery;
    public
     constructor Create(CreateSuspendend : BOOLEAN);
     destructor Destroy;
    protected
     procedure Execute; override;
end;

implementation

constructor TMySQL.Create;
begin
Database := TZMySqlDatabase.Create(nil);
Transact := TZMySqlTransact.Create(nil);
Query := TZMySqlQuery.Create(nil);
Transact.Database := Database;
Query.Database := DAtabase;
inherited Create(FALSE);
end;

procedure TMySQL.Execute;
begin
//
end;

destructor TMySQL.Destroy;
begin
Database.Free;
Transact.Free;
Query.Free;
inherited Destroy;
end;
end.
Danke,

Daniel
Daniel
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Zeos MySQL - Thread

  Alt 3. Sep 2003, 14:39
Was für ein hängen?
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Zeos MySQL - Thread

  Alt 3. Sep 2003, 14:41
naja ein "hängen" insofern dass die Anwendung während einer Query nicht reagiert...
Daniel
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Zeos MySQL - Thread

  Alt 3. Sep 2003, 14:45
Achso. Ich arbeite auch mit Zeos. Ist mir noch nicht aufgefallen
Welche DB nimmst du?

Du willst also denn Query asynchron laufen lassen?
D.h. der Query soll laufen und irgendwann fertig werden können
ohne Einfluss auf das Programm. Das Programm selbst soll ohne
auf ein Ergebnis des Query warten zu müssen, weiter arbeiten.
So richtig?
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Zeos MySQL - Thread

  Alt 3. Sep 2003, 14:47
Zitat:
Achso. Ich arbeite auch mit Zeos. Ist mir noch nicht aufgefallen
Welche DB nimmst du?

Du willst also denn Query asynchron laufen lassen?
D.h. der Query soll laufen und irgendwann fertig werden können
ohne Einfluss auf das Programm. Das Programm selbst soll ohne
auf ein Ergebnis des Query warten zu müssen, weiter arbeiten.
So richtig?
Also ich arbeite mit einer !Externen! MYSQL DB

Ja Queries sollen die Anwendung nicht stören - aber wenn sie fertig sind einen Refresh ausführen.
Daniel
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Zeos MySQL - Thread

  Alt 3. Sep 2003, 15:01
Um dein Codevorgabe weiterzuführen:

Code:
unit mysqldb;

interface

uses Windows, Forms, Messages, SysUtils, Variants, Classes, Graphics, Controls,
     DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon;

type TMySQL = class(TThread)
    Database: TZMySqlDatabase;
    Transact: TZMySqlTransact;
       Query: TZMySqlQuery;
    public
     
     constructor Create(CreateSuspendend : BOOLEAN);
     destructor Destroy;
    protected
     procedure Execute; override;
end;

implementation

constructor TMySQL.Create;
begin
Database := TZMySqlDatabase.Create(nil);
Transact := TZMySqlTransact.Create(nil);
Query   := TZMySqlQuery.Create(nil);
Transact.Database := Database;
Query.Database := DAtabase;
inherited Create(FALSE);
end;

procedure TMySQL.Execute;
const
 WM_REFRESHAFTERQUERY= WM_USER+1001
begin
QueryFW.Sql.Add('SELECT * FROM X WHERE a=b;');
Query.ExecSQL;
PostMessage (Handle, WM_REFRESHAFTERQUERY, 0, 0);
end;

destructor TMySQL.Destroy;
begin
Database.Free;
Transact.Free;
Query.Free;
inherited Destroy;
end;
end.
Dann halt noch ne Behandlungsroutine für den Abfang der Nachricht
WM_REFRESHAFTERQUERY.
Probier das mal. Ich weiss jedoch nicht ob das genau funktioniert.
Eigentlich hab ich nur Synchronisationen mit Threads gemacht.
Das ist aber nicht genau das was du brauchst, soweit ich dich richtig
verstanden hab.

Wie der Aufruf des Threads funktioniert weisst du, oder?
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Zeos MySQL - Thread

  Alt 4. Sep 2003, 11:26
schon - soweit hab ich auch probiert.

das einzige was mich schlaucht ist:

- das funktioniert super bei INSERT, UPDATE oder DELETe

aber bei select - würd ich ja gerne Daten zurückerhalten. Wie kann ich das machen?

mfg
Daniel
Daniel
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Zeos MySQL - Thread

  Alt 4. Sep 2003, 11:52
Puh ... warte hab ne Idee:

Code:
unit mysqldb;

interface

uses Windows, Forms, Messages, SysUtils, Variants, Classes, Graphics, Controls,
     DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon;

type TMySQL = class(TThread)
    Database: TZMySqlDatabase;
    Transact: TZMySqlTransact;
       Query: TZMySqlQuery;
    public
     
     constructor Create(CreateSuspendend : BOOLEAN);
     destructor Destroy;
     procedure DoQueryResultGlobal;
    protected
     procedure Execute; override;
end;

implementation

constructor TMySQL.Create;
begin
Database := TZMySqlDatabase.Create(nil);
Transact := TZMySqlTransact.Create(nil);
Query   := TZMySqlQuery.Create(nil);
Transact.Database := Database;
Query.Database := DAtabase;
inherited Create(FALSE);
end;

procedure TMySQL.DoQueryResultGlobal;
begin
 Form1.QueryGlobal:=Query;
end;

procedure TMySQL.Execute;
const
 WM_REFRESHAFTERQUERY= WM_USER+1001 
begin
Query.Sql.Add('SELECT * FROM X WHERE a=b;');
Query.ExecSQL;
Synchronize(DoQueryResultGlobal);
PostMessage (Handle, WM_REFRESHAFTERQUERY, 0, 0);
end;

destructor TMySQL.Destroy;
begin
Database.Free;
Transact.Free;
Query.Free;
inherited Destroy;
end;
end.
QueryGlobal ist dann ein Query (TZMySQLQuery) in dem Formular
oder Unit, von der aus der Thread gestartet wird. Ist die unsaubere Variante.
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Zeos MySQL - Thread

  Alt 4. Sep 2003, 11:57
klingt blöd - gefällt mir nich die Variante.

wäre es nicht besser eine art "Result" zurückzugeben?
Daniel
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#10

Re: Zeos MySQL - Thread

  Alt 4. Sep 2003, 12:27
Hab es hinbekommen. Zumindest funktionierts bei mir;

Code:
unit MySQL;

interface

uses Windows, Forms, Messages, SysUtils, Variants, Classes, Graphics, Controls,
     DB, ZQuery, ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon;

type TMySQL = class(TThread)
    Database: TZMySqlDatabase;
    Transact: TZMySqlTransact;
       Query: TZMySqlQuery;
    public

     constructor Create(CreateSuspendend : BOOLEAN);
     destructor Destroy;
     procedure DoQueryResultGlobal;
    protected
     procedure Execute; override;
end;

implementation

uses Unit1;

constructor TMySQL.Create;
begin
Database := TZMySqlDatabase.Create(nil);
Transact := TZMySqlTransact.Create(nil);
Query   := TZMySqlQuery.Create(nil);
Transact.Database := Database;
Query.Database := DAtabase;
Database.Login:='Benutzername';
Database.Password:='Passwort';
Database.Database:='Deine Gewollte DB';
inherited Create(FALSE);
end;

procedure TMySQL.DoQueryResultGlobal;
begin
   Form1.DataSource.DataSet:=Query;
   Query.Active:=true;
end;

procedure TMySQL.Execute;
const
 WM_REFRESHAFTERQUERY= WM_USER+1001;
begin
 Query.Sql.Add('SELECT * FROM Tabelle;');
 Synchronize(DoQueryResultGlobal);
 PostMessage (Handle, WM_REFRESHAFTERQUERY, 0, 0);
 Application.ProcessMessages;
end;

destructor TMySQL.Destroy;
begin
Database.Free;
Transact.Free;
Query.Free;
inherited Destroy;
end;
In Form1 liegt bei mir nur ein DBGrid & eine DataSource, welche miteinander verbunden sind;
Vergiss aber nicht an irgendeiner Stelle den Thread wieder zubeenden.

Wenn du nun das Form1.xxx Zugriff zu unsauber ist, übergib einfach bei der Erzeugung des Threads das DataSource-Objekt.
  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 21:50 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