Multithreading : création de threads d'interface utilisateur
Un thread d'interface utilisateur est généralement utilisé pour gérer les informations entrées par l'utilisateur et répondre aux événements indépendamment des threads exécutant d'autres parties de l'application. Le principal thread de l'application (fourni dans votre classe dérivée de CWinApp) est déjà créé et lancé pour vous. Cette rubrique décrit les étapes nécessaires pour créer des threads d'interface utilisateur supplémentaires.
La première chose à faire lorsque vous créez un thread d'interface utilisateur est de dériver une classe de CWinThread. Vous devez déclarer et implémenter cette classe à l'aide des macros DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE. Cette classe doit substituer certaines fonctions, et peut en substituer d'autres. Ces fonctions et leur finalité sont présentées dans le tableau suivant.
Fonctions à substituer lors de la création d'un thread d'interface utilisateur
Fonction |
Objectif |
---|---|
Procède au nettoyage lorsque le thread arrive au bout de son chemin d'exécution. Cette fonction est généralement substituée. |
|
Procède à l'initialisation de l'instance du thread. Cette fonction doit être substituée. |
|
Effectue un traitement quand le thread est au repos. Cette fonction n'est généralement pas substituée. |
|
Filtre les messages avant leur distribution à TranslateMessage et à DispatchMessage. Cette fonction n'est généralement pas substituée. |
|
Intercepte les exceptions non reconnues par les gestionnaires de commandes et de messages du thread. Cette fonction n'est généralement pas substituée. |
|
Fonction de contrôle du thread. Contient la pompe de messages. Cette fonction est rarement substituée. |
MFC fournit deux versions de AfxBeginThread par la surcharge de paramètres : une pour les threads d'interface utilisateur et une autre pour les threads de travail. Pour commencer votre thread d'interface utilisateur, appelez AfxBeginThread, en fournissant les informations suivantes :
La RUNTIME_CLASS de la classe que vous avez dérivée de CWinThread.
(Facultatif) Le niveau de priorité voulu. La priorité normale correspond à la valeur par défaut. Pour plus d'informations sur les niveaux de priorité disponibles, consultez SetThreadPriority dans le Kit de développement logiciel (SDK) Windows.
(Facultatif) La taille de la pile du thread. La valeur par défaut est la même taille de pile que celle du thread parent.
(Facultatif) CREATE_SUSPENDED si vous souhaitez que le thread soit créé dans un état suspendu. La valeur par défaut est 0, ou démarrez le thread normalement.
(Facultatif) Les attributs de sécurité souhaités. La valeur par défaut est le même accès que le thread parent. Pour plus d'informations sur le format de ces données de sécurité, consultez SECURITY_ATTRIBUTES dans le Kit de développement logiciel (SDK) Windows.
AfxBeginThread accomplit l'essentiel du travail à votre place. Elle crée un objet de votre classe, l'initialise avec les informations que vous fournissez et appelle CWinThread::CreateThread pour lancer l'exécution du thread. Des vérifications sont effectuées tout au long de la procédure pour s'assurer que tous les objets sont libérés correctement au cas où une partie de la création échouerait.