THREADS ERREUR

cs_w38 Messages postés 12 Date d'inscription vendredi 16 août 2002 Statut Membre Dernière intervention 6 septembre 2002 - 16 août 2002 à 14:18
cs_w38 Messages postés 12 Date d'inscription vendredi 16 août 2002 Statut Membre Dernière intervention 6 septembre 2002 - 18 août 2002 à 00:57
Bonjour,

Étant donné que j'ai une application qui met un temps fou, j'ai décidé
d'utiliser des threads.
Toutefois, le bouquin que j'ai stipule une formule qui me génère une
exception.
Pourquoi ?

var // variable générale
threadID,hthread:thandle;

procedure test;stdcall;
begin
form1.query1.sql.clear;
form1.query1.sql.add('Select * FROM SAL');
form1.query1.open; // déclare l'erreur.
form1.label1.caption:='a'; // si je met que ca dans la procedure ca marche.
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hthread:=createthread(nil,0,@test,0,0,threadID);
end;

Merci

Métral Xavier

8 réponses

garnotte Messages postés 14 Date d'inscription mardi 29 janvier 2002 Statut Membre Dernière intervention 18 février 2016 1
16 août 2002 à 16:49
Je ne crois pas que tu puisses modifier impunément ta form à partir d'un autre thread. J'ai eu un problème similaire dans une application bâtie sous XP, il a fallut que j'utilise le système de messages de Windows pour y arriver (fonctions SendMessage et PostMessage).

Bonne chance!

Garnotte
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 août 2002 à 19:17
Pour Garnotte : l'utilité des threads secondaires serait fortement discutable si l'on ne pouvait pas s'en servir pour mettre à jour des contrôles visuels sur une fiche !

Revois la déclaration de l'objet TThread et regardes parmi ses méthodes, tu devrais trouver une méthode qui porte le doux nom de Synchronize. Dis-toi que tu es aux portes du paradis...

May Delphi be with you.
Delphi advanced
0
garnotte Messages postés 14 Date d'inscription mardi 29 janvier 2002 Statut Membre Dernière intervention 18 février 2016 1
16 août 2002 à 19:21
T'as raison, j'avais oublié le fameux Synchronize :blush)

Merci du tuyau!
0
cs_w38 Messages postés 12 Date d'inscription vendredi 16 août 2002 Statut Membre Dernière intervention 6 septembre 2002
16 août 2002 à 23:32
Je souhaite utiliser des threads pour gérer deux requetes en même temps.

En fait j'ai lu attentivement vos mails :big) , toutefois j'ai refait tout mon code, cette fois ca marche, mais les requêtes ne s'execute pas en même temps... Pourquoi ?

MERCI

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Query1: TQuery;
Query2: TQuery;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource1: TDataSource;
DataSource2: TDataSource;
Session1: TSession;
Session2: TSession;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

type T2 = class(TThread)
private
I:integer;
procedure Execute; override;
procedure Mostra;
end; { of class declaration }

type T3 = class(TThread)
private
I:integer;
procedure Execute; override;
procedure Mostra;
end; { of class declaration }

var
Form1: TForm1;
un_delay:tdelay;
implementation

{$R *.DFM}

procedure T2.Mostra;
begin
form1.query1.close;
form1.query1.sql.clear;
form1.query1.SQL.add('Select SA_MATRICULE,SUM(HU_VALEURCUMUL) AS MTT');
form1.query1.SQL.add('FROM F_HCUM');
form1.query1.SQL.add('GROUP BY SA_MATRICULE');
form1.query1.SQL.add('ORDER BY SA_MATRICULE ASC');
form1.query1.open;
form1.label1.caption:='OK';
end;

procedure T2.Execute;
begin
Synchronize(Mostra);
end; { of procedure }

procedure T3.Mostra;
begin
form1.query2.close;
form1.query2.sql.clear;
form1.query2.SQL.add('Select SA_MATRICULE,SUM(HU_VALEURCUMUL) AS MTT');
form1.query2.SQL.add('FROM F_HCUM');
form1.query2.SQL.add('GROUP BY SA_MATRICULE');
form1.query2.SQL.add('HAVING MTT>100');
form1.query2.SQL.add('ORDER BY SA_MATRICULE DESC');
form1.query2.open;
form1.label2.caption:='OK';
end;

procedure T3.Execute;
begin
Synchronize(Mostra);
end; { of procedure }

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.query2.sql.add('Select * from F_SAL');
form1.query2.open;
form1.query1.sql.add('Select * from F_SAL');
form1.query1.open;

T2.Create(false);
T3.Create(false);
end; { of procedure }

end. { of Unit }

end.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 août 2002 à 23:49
As-tu mis des noms de session différents pour chaque TQuery ?

Euh, qui est chargé de détruire les threads une fois qu'ils ont terminé de s'exécuter ?
Je ne vois ici nulle part d'affectation à la propriété FreeOnTerminate de chaque thread...

May Delphi be with you.
Delphi advanced
0
cs_w38 Messages postés 12 Date d'inscription vendredi 16 août 2002 Statut Membre Dernière intervention 6 septembre 2002
17 août 2002 à 12:06
En fait ca marche, mais le problème c'est que les processus s'exécutent les uns à la suite des autres... Sinon j'ai bien mis des sessions différentes au niveau des tquery.
Est-ce que quelqu'un peut m'envoyer du code à l'adresse w38@ifrance.com... Pour l'exécution de deux requêtes en même temps... Juste histoire de voir.

MERCI BEAUCOUP
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
17 août 2002 à 17:32
Regardes à l'adresse suivante sur le site de Borland : Performing database queries in a background thread.

May Delphi be with you.
Delphi advanced
0
cs_w38 Messages postés 12 Date d'inscription vendredi 16 août 2002 Statut Membre Dernière intervention 6 septembre 2002
18 août 2002 à 00:57
Merci je vais aller voir de ce pas...
0
Rejoignez-nous