![]() |
Zeos MySQL - Thread
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) :cry: wäre super wenn mir jmd. helfen könnte das ganze zu realisieren. Muss dohc möglich sein.
Delphi-Quellcode:
Danke,
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. Daniel |
Re: Zeos MySQL - Thread
Was für ein hängen?
|
Re: Zeos MySQL - Thread
naja ein "hängen" insofern dass die Anwendung während einer Query nicht reagiert...
|
Re: Zeos MySQL - Thread
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? |
Re: Zeos MySQL - Thread
Zitat:
Ja Queries sollen die Anwendung nicht stören - aber wenn sie fertig sind einen Refresh ausführen. |
Re: Zeos MySQL - Thread
Um dein Codevorgabe weiterzuführen:
Code:
Dann halt noch ne Behandlungsroutine für den Abfang der Nachricht
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. 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? |
Re: Zeos MySQL - Thread
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 |
Re: Zeos MySQL - Thread
Puh ... warte hab ne Idee:
Code:
QueryGlobal ist dann ein Query (TZMySQLQuery) in dem Formular
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. oder Unit, von der aus der Thread gestartet wird. Ist die unsaubere Variante. |
Re: Zeos MySQL - Thread
klingt blöd - gefällt mir nich die Variante.
wäre es nicht besser eine art "Result" zurückzugeben? |
Re: Zeos MySQL - Thread
Hab es hinbekommen. Zumindest funktionierts bei mir;
Code:
In Form1 liegt bei mir nur ein DBGrid & eine DataSource, welche miteinander verbunden sind;
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; 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz