BEGINTHREAD |
Débute un processus |
---|---|
Delphi/Kylix/Lazarus | System |
Syntaxe
Function BeginThread(SecurityAttributes:Pointer; StackSize:Integer; ThreadFunc:TThreadFunc; Parameter:Pointer; CreationFlags:Integer;Var ThreadId:Integer):Integer; |
Function BeginThread(SecurityAttributes:Pointer; StackSize:Cardinal; ThreadFunc:TThreadFunc; Parameter:Pointer; CreationFlags:Cardinal;Var ThreadId:Cardinal):Integer; |
Paramètres
Nom | Description |
---|---|
SecurityAttributes | Ce paramètre permet d'indiquer le pointeur des attributs de sécurité si nécessaire. |
StackSize | Ce paramètre permet d'indiquer la taille de la pile si nécessaire |
ThreadFunc | Ce paramètre permet d'indiquer l'adresse de la fonction contenant le processus |
Parameter | Ce paramètre permet d'indiquer le pointeur des paramètres supplémentaire. |
CreationFlags | Ce paramètre permet d'indiquer les attributs de création du processus. |
ThreadId | Ce paramètre permet d'indiquer le numéro d'identification du processus. |
Description
Cette fonction permet de lancer un nouveau processus d'exécution.
Remarque
- ATTENTION ! Les types de données utilisés comme paramètre ne sont pas les mêmes d'une version à l'autre de Delphi ! Ainsi, il faudra changer le type de données «Integer» pour «Cardinal» ou vice versa si vous rencontrez une erreur «E2033 Les types des paramètres VAR originaux et formels doivent être identiques».
- Appelez BeginThread pour démarrer un procesus léger dans un programme multi-processus. La fonction BeginThread appelle la fonction CreateThread d'API de Windows, démarrant un nouveau processus léger et appelle la fonction de processus léger (ThreadFunc) dans le contexte du nouveau processus léger. Lorsque la fonction de processus léger retourne, le processus léger se termine.
- La fonction BeginThread renvoie l'identificateur de descripteur du nouveau processus léger ou zéro si Windows ne peut pas créer le processus léger. La fonction BeginThread est une véritable fonction.
- Vous devez utiliser BeginThread au lieu de la fonction CreateThread de l'API de Windows car BeginThread définit la variable globale IsMultiThread sur True. La fonction BeginThread définit également les paramètres ThreadFunc et ThreadID dans le style Pascal plutôt que dans le style C.
- La fonction de processus léger doit intercepter et gérer toutes les exceptions. Si la fonction de processus léger lève une exception qu'elle ne gère pas, la fonction BeginThread intercepte l'exception et met fin à l'application.
- Comme toute ressource Windows, vous devez appeler CloseHandle une fois le processus léger terminé pour vous assurer que Windows libère toutes les ressources associées au processus léger. Le Delphi a une petite fuite de mémoire si vous démarrez un processus léger à l'état suspendu, puis fermez-le sans jamais reprendre le processus léger. Pour éviter la fuite, reprenez toujours le fil avant de le fermer.
Exemple
Voici un exemple montrant comment lancer deux processus fils :
- Program BeginThreadSamples;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Type
- ForkData=Record
- Msg:String;
- End;
- ForkDataPtr=^ForkData;
-
- Var
- Thread1, Thread2:Integer;
- Id1,Id2:Integer;
- Fork1,Fork2:ForkData;
- I:Byte;
-
- Function MyFork(Parameter:Pointer):Integer;
- Var
- ForkData:ForkDataPtr Absolute Parameter;
- Begin
- MyFork := 0;
- Inc(I);
- WriteLn(ForkData^.Msg);
- EndThread(0);
- End;
-
- BEGIN
- I:=0;
- Fork1.Msg := 'Le programme fils 1!';
- Fork2.Msg := 'Le programme fils 2!';
- Thread1 := BeginThread(NIL,0,@MyFork,@Fork1,0,Id1);
- Thread2 := BeginThread(NIL,0,@MyFork,@Fork2,0,Id2);
- WriteLn('Le programme parent!');
- Repeat Until I >= 2;
- END.
on obtiendra le résultat semblable suivant :
Le programme parent!Le programme fils 1!
Le programme fils 2!
Voir également
Langage de programmation - Delphi/Kylix/Lazarus - Référence de procédures et fonctions - EndThread
Langage de programmation - Delphi/Kylix/Lazarus - Référence des variables - IsMultiThread
Langage de programmation - Delphi/Kylix/Lazarus - Références de mots réservés (mots clefs) - ThreadVar
Dernière mise à jour : Mercredi, le 18 février 2015