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 |
|
Bibliothèque |
|