THREADS ERREUR

Signaler
Messages postés
12
Date d'inscription
vendredi 16 août 2002
Statut
Membre
Dernière intervention
6 septembre 2002
-
Messages postés
12
Date d'inscription
vendredi 16 août 2002
Statut
Membre
Dernière intervention
6 septembre 2002
-
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

Messages postés
14
Date d'inscription
mardi 29 janvier 2002
Statut
Membre
Dernière intervention
18 février 2016
1
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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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
Messages postés
14
Date d'inscription
mardi 29 janvier 2002
Statut
Membre
Dernière intervention
18 février 2016
1
T'as raison, j'avais oublié le fameux Synchronize :blush)

Merci du tuyau!
Messages postés
12
Date d'inscription
vendredi 16 août 2002
Statut
Membre
Dernière intervention
6 septembre 2002

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.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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
Messages postés
12
Date d'inscription
vendredi 16 août 2002
Statut
Membre
Dernière intervention
6 septembre 2002

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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Regardes à l'adresse suivante sur le site de Borland : Performing database queries in a background thread.

May Delphi be with you.
Delphi advanced
Messages postés
12
Date d'inscription
vendredi 16 août 2002
Statut
Membre
Dernière intervention
6 septembre 2002

Merci je vais aller voir de ce pas...