Utilisation du thread VCL principal
Remonter à Comment construire des applications multithreads
L'utilisation du thread VCL principal comprend les étapes de base suivantes :
- Créer une routine distincte pour gérer les messages Windows reçus par les composants de votre application.
- Appeler régulièrement CheckSynchronize.
- Déclarer, si nécessaire, des variables locales aux threads pour une utilisation exclusive par votre thread.
Pour créer une routine distincte
- Ecrivez une routine de thread principal qui gère l'accès aux propriétés des objets et l'exécution des méthodes de tous les objets de votre application.
- Appelez la routine en utilisant la méthode TThread.Synchronize (Delphi) ou TThread::Synchronize (C++). Le code suivant illustre un exemple de l'appel d'une méthode en utilisant Synchronize :
procedure TMyThread.PushTheButton begin Button1.Click; end; procedure TMyThread.Execute; begin ... Synchronize(PushThebutton); ... end;
void TMyThread::PushTheButton() { Form1->Button1->Click(); } void __fastcall TMyThread::Execute() { ... Synchronize( (TThreadMethod)&PushTheButton ); ... }
Synchronize attend le thread principal pour entrer dans la boucle des messages, puis exécute la méthode qui lui est transmise.
Remarque : Comme Synchronize utilise une boucle de messages, elle ne fonctionne pas dans les applications console. Pour les applications console, utilisez d'autres mécanismes, comme les sections critiques, pour protéger l'accès aux objets VCL.
Pour appeler CheckSynchronize
- Appelez régulièrement CheckSynchronize depuis le thread principal pour que les threads d'arrière-plan synchronisent leur exécution avec le thread principal.
- Pour garantir la sécurité des appels aux threads d'arrière-plan, appelez CheckSynchronize lorsque l'application est inactive (par exemple, dans un gestionnaire d'événements OnIdle).
Pour utiliser une variable locale au thread
- Identifiez les variables que vous voulez rendre globales pour toutes les routines exécutées dans votre thread sans qu'elles ne soient partagées par les autres instances de la même classe de thread.
- Pour Delphi, déclarez ces variables dans une section threadvar, par exemple :
threadvar x: integer;
Pour C++, déclarez ces variables avec le modificateur __thread :
int __thread x;
Remarque : Utilisez la section threadvar uniquement pour des variables globales. Ne l'utilisez pas pour les variables Pointer et Function ou les types qui utilisent une sémantique de copie-sur-écriture, comme les chaînes longues.
Remarque : Pour C++, si vous initialisez une variable __thread, vous devez l'initialiser par une expression constante. Par exemple, int __thread foo = 3; est une instruction correcte, mais int __thread foo = get_value(); est interdite car l'initialisation se produit à l'exécution.