Initialisation du thread
Remonter à Définition d'objets thread - Index
Si vous souhaitez écrire du code d'initialisation pour la nouvelle classe de thread, vous devez écraser la méthode Create. Ajoutez un nouveau constructeur à la déclaration de la classe de thread et écrivez le code d'initialisation pour l'implémenter. C'est là que vous pouvez affecter une priorité par défaut au thread et indiquer s'il doit être libéré automatiquement à la fin de son exécution.
Affectation d'une priorité par défaut
La priorité indique la préférence accordée au thread quand le système d'exploitation répartit le temps machine entre les différents threads de l'application. Utilisez un thread de priorité élevée pour gérer les tâches critiques et un thread de priorité basse pour les autres tâches. Pour indiquer la priorité de l'objet thread, affectez la propriété Priority.
Si vous écrivez une application Windows, les valeurs de Priority se répartissent sur une échelle, comme décrit dans le tableau suivant :
Priorités des threads :
Valeur | Priorité |
---|---|
tpIdle |
Le thread s'exécute seulement quand le système est en attente. Windows n'interrompt pas d'autres threads pour exécuter un thread de priorité tpIdle. |
tpLowest |
La priorité du thread est deux points en dessous de la normale. |
tpLower |
La priorité du thread est un point en dessous de la normale. |
tpNormal |
La priorité du thread est normale. |
tpHigher |
La priorité du thread est un point au dessus de la normale |
tpHighest |
La priorité du thread est deux points au dessus de la normale. |
tpTimeCritical |
Le thread a la priorité la plus élevée. |
Avertissement : "Gonfler" la priorité du thread pour une opération utilisant intensivement la CPU peut "sous-alimenter" les autres threads de l'application. Il ne faut accorder une priorité élevée qu'à des threads qui passent l'essentiel du temps à attendre des événements extérieurs.
Le code suivant illustre le constructeur d'un thread de priorité basse qui effectue des tâches d'arrière-plan ne devant pas interférer avec les performances du reste de l'application :
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
Priority := tpIdle;
end;
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended): TThread(CreateSuspended)
{
Priority = tpIdle;
}
//---------------------------------------------------------------------------
Libération des threads
Généralement, lorsque les threads ont fini d'être exécutés, ils peuvent être simplement libérés. Dans ce cas, le plus simple consiste à laisser l'objet thread se libérer lui-même. Pour ce faire, affectez la valeur True à la propriété FreeOnTerminate.
Il y a cependant des cas où la fin d'un thread doit être coordonnée avec les autres threads. Par exemple, il se peut que vous deviez attendre qu'un thread renvoie une valeur avant d'effectuer une action dans un autre thread. Pour ce faire, vous ne souhaitez pas libérer le premier thread avant que le second n'ait reçu la valeur renvoyée. Vous pouvez traiter ce type de situation en affectant la valeur False à FreeOnTerminate et en libérant explicitement le premier thread à partir du second.