Classe CAMThread

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

La CAMThread classe est une classe abstraite pour la gestion des threads de travail.

Variables de membre protégé Description
m_hThread Handle vers le thread.
Variables de membre public Description
m_AccessLock Section critique qui empêche le thread d’accéder à d’autres threads.
m_WorkerLock Section critique qui verrouille les données partagées entre les threads.
Méthodes publiques Description
CAMThread Méthode du constructeur.
~ CAMThread Méthode de destructeur. Virtuel.
InitialThreadProc Appelle la méthode ThreadProc lors de la création du thread.
Créer Crée le thread.
CallWorker Signale au thread une requête.
Close Attend que le thread se ferme, puis libère ses ressources.
ThreadExists Interroge si le thread existe.
GetRequest Attend la requête suivante.
CheckRequest Vérifie s’il existe une demande, sans bloquer.
Réponse Répond à une demande.
GetRequestHandle Récupère un handle à l’événement signalé par la méthode CallWorker.
GetRequestParam Récupère la dernière requête.
CoInitializeHelper Appelle CoInitializeEx au début du thread.
Méthodes virtuelles pures Description
ThreadProc Procédure de thread.

Notes

Cette classe fournit des méthodes pour créer un thread de travail, transmettre des requêtes au thread et attendre que le thread se termine. Pour utiliser cette classe, procédez comme suit :

  • Dérivez une classe de CAMThread et remplacez la méthode virtuelle pure CAMThread::ThreadProc. Cette méthode est la procédure de thread qui est appelée au début du thread.
  • Dans votre application, créez une instance de votre classe dérivée. La création de l’objet ne crée pas le thread. Pour créer le thread, appelez la méthode CAMThread::Create .
  • Pour envoyer des demandes au thread, appelez la méthode CAMThread::CallWorker . Cette méthode prend un paramètre DWORD, dont la signification est définie par votre classe. La méthode se bloque jusqu’à ce que le thread réponde (voir ci-dessous).
  • Dans votre procédure de thread, répondez aux demandes en appelant CAMThread::GetRequest ou CAMThread::CheckRequest. La méthode GetRequest se bloque jusqu’à ce qu’un autre thread appelle CallWorker. La méthode CheckRequest n’est pas bloquante, ce qui permet au thread de case activée pour les nouvelles requêtes tout en travaillant de manière asynchrone.
  • Lorsque le thread reçoit une demande, appelez CAMThread::Reply pour débloquer le thread appelant. La méthode Reply prend un paramètre DWORD, qui est passé au thread appelant comme valeur de retour pour CallWorker.

Lorsque vous avez terminé avec le thread, appelez la méthode CAMThread::Close . Cette méthode attend que le thread se ferme, puis ferme le handle de thread. Votre message ThreadProc doit être assuré de quitter, seul ou en réponse à une demande CallWorker. La méthode de destructeur appelle également Close.

L’exemple suivant illustre ces étapes :

class MyThread : public CAMThread
{
protected:
    DWORD ThreadProc(void);
};

DWORD MyThread::ThreadProc()
{
    BOOL bShutDown = FALSE;
    while (!bShutDown)
    {
        DWORD req = GetRequest();
        printf("Request: %d\n", req);
        bShutDown = (req == 0);
        Reply(bShutDown ? S_FALSE : S_OK);
    }
    printf("Quitting Thread\n");
    return 1;
}

void main()
{
    MyThread thread;
    DWORD reply;
    
    thread.Create();
    reply = thread.CallWorker(3);
    reply = thread.CallWorker(0); // Thread exits.
}

Dans votre classe dérivée, vous pouvez également définir des fonctions membres qui valident les paramètres sur CallWorker. L’exemple suivant illustre une méthode classique pour ce faire :

enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT};

HRESULT Init(void)  { return CallWorker(CMD_INIT); }
HRESULT Run(void)   { return CallWorker(CMD_RUN); }
HRESULT Stop(void)  { return CallWorker(CMD_STOP); }
HRESULT Exit(void)  { return CallWorker(CMD_EXIT); }

La CAMThread classe fournit deux sections critiques en tant que variables membres publiques. Permet CAMThread::m_AccessLock de bloquer l’accès au thread par d’autres threads. (Par exemple, les méthodes Create et CallWorker contiennent ce verrou, pour sérialiser les opérations sur le thread.) Utilisez CAMThread::m_WorkerLock pour verrouiller les données partagées entre les threads.

Configuration requise

Condition requise Valeur
En-tête
Wxutil.h (include Streams.h)
Bibliothèque
Strmbase.lib (builds de vente au détail) ;
Strmbasd.lib (builds de débogage)