Parametrer un thread

Signaler
Messages postés
8
Date d'inscription
lundi 17 mars 2003
Statut
Membre
Dernière intervention
23 mai 2003
-
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008
-
j'aimerais passer un parametre à la fonction thread.execute.
or celle-ci n'est jamais appellée explicitement, c'est quand on lance thread.create qu'elle est appellée.
comment puis-je faire?
j'ai besoin de récupérer ce paramètre dans mon thread.
merci de me répondre

8 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Tu surcharges le constructeur en lui passant les paramètres aue tu veux. Exemple, on passe une chaine de caractères au thread :

type
  TMythread = class(TThread)
  private
    { Chaîne qui sera utilisée par la méthode Execute}
    FMyString: string;
  protected
    procedure Execute; override;
  public
    constructor Create(MyString: string);
  end;

implementation

{ TMythread }

constructor TMythread.Create(MyString: string);
begin
  inherited Create(true);
  FMyString := MyString;
  Resume;
end;

procedure TMythread.Execute;
begin
  FMyString := 'May Delphi be with you !';
  //etc
end;


Ceci est une implémentation très sommaire d'un thread mais elle répond à la question posée et rien d'autre...
NB : il est fortement déconseillé de passer la chaîne par adresse si on n'a pas l'assurance qu'elle n'est pas utilisée par ailleurs dans le thread principal de l'application. Sinon, gare aux collisions...
May Delphi be with you
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

C'est une question importante !
voilà pourquoi je me permet de rajouter ...

unit thread;
interface
//on peut utiliser les références exactement comme
//une autre unit
uses
Windows,SysUtils,Forms,ExtCtrls,StdCtrls,Classes,Controls;
function droite(substr: string; s: string): string;
function gauche(substr: string; s: string): string;

type
Compilation = class(TThread)
private
protected
procedure Execute;override;
public
// ici on peut envoyer au thread (const, var, array...)
// Create(S:String;V:Reel;T:array of ShortInt);
//n.b dans le cas de tableau passer au thread doit
// etre=[0..]sinon ça marche pas
constructor Create(..................................);
// après l'appel au thread sera fait suivant
// cette forme Compilation.Create(......);
end;

implementation
uses Unit1,Unit19;

procedure Compilation.Execute;
var
Ligne:String;
CheckPoints:Integer;
A_Partir_De,r:Integer;
label recommance;

begin
recommance:
Ligne:='Allo/Allooas/alloo';
Ligne:=droite('/',Ligne);
Ligne:=gauche('/',Ligne);
if Ligne='Allooas' then goto recommance
else exit;
end;

constructor Compilation.Create;
begin
inherited Create(true);
FreeOnTerminate := True;
Priority := tpLowest;
//comme l'utilisation d'un thread est critique
// il peut-être nécessaire de vérifier si le thread ne
//s'exécute pas déjà !
// de le synchroniser etc...
end;

function droite(substr: string; s: string): string;begin if pos(substr,s)=0 then result:='' else result:=copy(s, pos(substr, s)+length(substr), length(s)-pos(substr, s)+length(substr)); end;
function gauche(substr: string; s: string): string;begin result:=copy(s, 1, pos(substr, s)-1); end;

end.
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Aaaaaaaaaaaaaaaaaaaaaah !!

Un "GOTO" !!!!!!! %-6

Mais sinon, l'exemple est intéressant !

Bonne prog' !
[mailto:bestiol@cario.fr Bestiol.]
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Gloups ! :shock) :shock)
J'ai failli m'étrangler.
Goto, fonctions extérieures au thread...
Et le thread, tu le démarres quand ?

Comme exemple, il y a plus clean.
May Delphi be with you
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
Ah ?!
J'ai mal regardé l'exemple, alors !!
J'ai surtout accroché sur le "recommance:" et le Goto en dessous !

[mailto:bestiol@cario.fr Bestiol.]
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
Pour protéger contre les collisions y'a possibilitée ki pe servir d'exemple (ca pe servir à kelkes personnes)
il faut rajouter une CriticalSection de cette manière :

type
  TMythread = class(TThread)
  private
    { Chaîne qui sera utilisée par la méthode Execute}
    FMyString: string;
  protected
    procedure Execute; override;
  public
    constructor Create();
  end;

var
  FLock: TCriticalSection; //<<< déclaration du critical section...

implementation
 
{ TMythread }
 
constructor TMythread.Create;
begin
  inherited Create(true);
// si MyString est une variable externe alors dans le cas d'une lecture ca posera pas de gros prob normalement par contre en écriture ca peut cracher l'appli si 2 threads touchent à la meme variale en meme temps... mais pour l'exemple je met comment fer :
  FLock.Acquire; //<<< ceci a pour effet de bloker tous les ot threads
  FMyString := MyString;
  FLock.Release; // <<< ceci a pour effet de débloker les threads...
  Resume;
end;

procedure TMythread.Execute;
begin
  FMyString := 'May Delphi be with you !';
  //etc
end;

// a mettre en fin de form
Initialization
  If not Assigned(fLock) Then //<<< si le CriticalSection est pas assigné alors...
    fLock := TCriticalSection.Create; //<<< on le crée...

Finalization
  fLock.Free; //<<< ici on le libère...


plus la procedure est longue entre les Acquire et le Release moins bien c'est... et ce parce ke tout est bloké entre ces 2 fonctions et donc c'est pas forcément bon... mais avec ca... il y a pas de problème si plusieurs threads touchent à la meme variable :)

vala en espèrant pas m'etre planté... mais l'aide de Delphi vous en dira plus... normalement... ;)

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
La variable FString, déclarée dans l'exemple, est propre à chaque thread et seul le thread qui la possède peut y accèder.
En revanche, si FString avait été déclarée comme une simple variable globale, c'est à dire en dehors de la portée de la classe TMyThread, je suis d'accord avec Emandhal pour dire qu'il faut utiliser une section critique.
Il reste aussi la possibilité de déclarer FString dans une section ThreadVar, mais ceci seulement depuis Delphi 6.
May Delphi be with you
Messages postés
308
Date d'inscription
mardi 11 juin 2002
Statut
Membre
Dernière intervention
26 septembre 2008

lol :) c'étais juste un exemple

C'est vrai que l'utilisation du goto va à l'encontre
de la programmation correcte ...mais bon... ça peut
dépanner en cas extreme !

pour revenir au thread ,

il est important d'en parler car c'est très utile !