Parametrer un thread

optarel Messages postés 8 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 23 mai 2003 - 8 avril 2003 à 16:58
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008 - 9 avril 2003 à 23:03
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

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 avril 2003 à 19:54
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
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
9 avril 2003 à 09:07
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.
0
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
9 avril 2003 à 10:19
Aaaaaaaaaaaaaaaaaaaaaah !!

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

Mais sinon, l'exemple est intéressant !

Bonne prog' !
[mailto:bestiol@cario.fr Bestiol.]
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 avril 2003 à 13:32
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
0

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

Posez votre question
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
9 avril 2003 à 14:42
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.]
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
9 avril 2003 à 15:12
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...
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 avril 2003 à 18:33
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
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
9 avril 2003 à 23:03
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 !
0
Rejoignez-nous