Thread dans une class c++

Contenu du snippet

J'ai ecris une Class me permettant de me connecter sur des cameras numerique IP, cette class comprend une partie affichage et une partie telechargement, or dans cette meme Class les 2 fonctions doivent s'executer en parallele, d'où l'utilité d'un Thread. Ma Class n'est pas finalisée donc je ne la dépose pas pour le moment (mais si vous avez des question sur les Cameras IP, n'ésitez pas)
La partie Thread dans une Class ne fut pas facile donc je dépose simplement cette partie.
Il faut au moins 3 variables, un pointeur sur le thread, une structure de section critique, certaine données sont partager par des threads différents il est donc obligatoire d'utiliser une section critique celle ci permet d'eviter que 2 Threads utilisent la meme donnée en meme temps:
Initialiser la section: InitializeCriticalSection(&SynchroMedia);
Avant d'utiliser une variable: EnterCriticalSection(&SynchroMedia);
Apres avoir utiliser la variable: LeaveCriticalSection(&SynchroMedia);
Detruire la section critique: DeleteCriticalSection(&SynchroMedia);

Au départ je pensais simplement créé un Thread avec l'une des fonctions de ma Class, ET bien NON ça ne fonctionne pas. Il faut passer par une fonction qui n'appartient pas à la Class et lui donner en paramètre un pointeur sur la class pour lui permettre d'appeler la fonction qui nous intérresse.:
ThreadStart: est la fonction qui n'appartient pas à ma Class.
this: est le pointeur sur ma Class donné en paramettre.
Ptr_ThreadMedia=CreateThread(NULL,NULL,ThreadStart,(LPVOID)this ,NULL,&dwThreadIDMedia);
Voici la fonction ThreadStart

DWORD WINAPI ThreadStart(LPVOID lpthis)
{// Pointeur sur ma Class
MaClass*ClassThis = (MaClass*) lpthis;
// Appel de la fonction de ma Class, ThreadStart et Thread_DownLoadMedia seront dans un Thread différent.
ClassThis->Thread_DownLoadMedia(0);
return 0;
}

Des que l'on sort de la fonction Thread_DownLoadMedia(), le Thread se termine, il faut donc boucler sur une reception de message, PeekMessage me permet de receptionner des ordres et donc de savoir ce que doit faire cette fonction.
Les autres fonctions donnent des taches à effectuer en envoyant des messages via:

PostThreadMessage(dwThreadIDMedia,WM_START_DOWNLOAD_AUTO,NULL,NULL);

Le code suivant donne le minimum, c'est a dire constructeur et destructeur de la Class, avec initialisation des variables et section critique,le destructeur envoie un message au thread et détruit la section critique.
Une fonction crait le thread.
Si vous avez des questions, en évitant "A quoi ça sert" ==> Si vous ne voyez pas à quoi ça sert c'est que vous n'en avez pas besoin.

Sephiro

Source / Exemple :


MaClass:: MaClass (){
 	Ptr_ThreadMedia=NULL;
	dwThreadIDMedia=0;
	InitializeCriticalSection(&SynchroMedia);

}
MaClass::~ MaClass (){
// ----- Si le Thread existe je lui demande de sortir
	if (Ptr_ThreadMedia!=NULL) 
	     PostThreadMessage(dwThreadIDMedia,WM_TERMINER_THREAD,NULL,NULL);
// ---- Ajouter ici les tests pour controler la fermeture du thread
	CloseHandle(Ptr_ThreadMedia);
	
// ----- Destruction Section Critique
	DeleteCriticalSection(&SynchroMedia);
		
	return;
}
void MaClass::StartDownload(void)
{	if (Ptr_ThreadMedia==NULL){
		Ptr_ThreadMedia=CreateThread(NULL,NULL,ThreadStart,(LPVOID)this  ,NULL,&dwThreadIDMedia);
	}
}
return;
}

DWORD WINAPI ThreadStart(LPVOID lpthis)
{
	MaClass*ClassThis = (MaClass*) lpthis;
    ClassThis->Thread_DownLoadMedia(0);
	return 0;
}
DWORD WINAPI MaClass::Thread_DownLoadMedia(LPVOID lpParam)
{

// ----- Le thread est prioritaire
 SetPriorityClass(GetCurrentProcess (), REALTIME_PRIORITY_CLASS); 
 SetThreadPriority(GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); 

 do 
 { 
 // ----- Liste des messages 
  	if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)==TRUE)
	{switch(Msg.message )
		{
		case WM_TERMINER_THREAD:
                        // ----- Demande de fin de thread, permet de sortir proprement
			return TRUE;
		case WM_STOP_DOWNLOAD_AUTO:
			// ----- Appeler ICI la fonction permettant de stopper le download
			break;
		case WM_START_DOWNLOAD_AUTO:
			// ----- Appeler ICI la fonction permettant de commencer le download
			break;
		case WM_DOWNLOAD_ONESHOT:
			// ----- ???????????
			break;
		default :
			TranslateMessage(&Msg);
			DispatchMessage(&Msg);
			break;
		}
	}
} while(true); // boucle
return TRUE;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.