Thread dans une class c++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 27 289 fois - Téléchargée 32 fois

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

Ajouter un commentaire

Commentaires

cs_sephiro
Messages postés
101
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
18 février 2008

Salut HUGO_CPP
j'ai fais quelques tests sur le mpeg4 sans activeX propriétaire, le probleme est tres simple la plupart des fabricant propose un activeX propre à leur marque car il ne respecte pas la norme à 100%. J'ai voulu utiliser une lib mpeg4 sur une axis et une sony SNC P5 ça n'a jamais fonctionné les infos sur les forums me donnent les memes remarques. Donc je travail en mjpeg, c'est à dire que je vais chercher des images jpeg les une apres les autres, plus lourd en réseau plus lent mais de meilleur qualité, en plus cette methode est tres legere je peux afficher 18 caméras en simultané sur 2 écrans, j'ai fait un test avec 30 (ça marche aussi mais il faut une bete de course) j'au un rafreshissement à 200ms c'est à dire 5 images/s par camera ce qui est raisonnable.
Pour ton clic:
case WM_LBUTTONDOWN: { // message d'un Click sur une fenetre (image)
RECT MyWin;
GetWindowRect (hDlg, &MyWin); // pour connaitre la position et taille de ta fenetre
POINT Mouse;
GetCursorPos(&Mouse); // pour connaitre la position de la souris donc de ton clic


Sephiro
hugo_cpp
Messages postés
8
Date d'inscription
dimanche 8 janvier 2006
Statut
Membre
Dernière intervention
17 août 2006

Slt SEPHIRO
J'ai le même probleme que yahyaoui_oussama, j'ai une caméra SONY IP qui délivre du MPEG4 et je voudrais récupérer le flux pour l'afficher et le sauvegarder (un peu les 2 thread en parralèle que tu propose), j'ai en effet un activeX qui me permet d'afficher l'image mais c'est pas génial du tout car il me configure une fenetre pas top et je n'arrive pas à récupérer les coordonnées du pixel que je pointe lorsque je clique sur l'image.
Si tu peut m'aider un peu vu que t'as l'air de connaitre le sujet ce serait cool!
Merci
cs_sephiro
Messages postés
101
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
18 février 2008

yahyaoui_oussama
tu veux lire le flux Mpeg de ta camera ou tu veux lire une image jpeg pour créé ton propre flux (motion jpeg)
Certainne marque de camera offre des activeX pour faciliter le travail (Axis ou Sony)
yahyaoui_oussama
Messages postés
1
Date d'inscription
vendredi 3 mars 2006
Statut
Membre
Dernière intervention
5 juillet 2006

s'il vous plait explique moi votre code
je veut lire le flux vidéo d'une caméra ip
et en suite le traiter.
voulez-vous m'aidez? merci
cs_neria
Messages postés
320
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
16 février 2009

Désolé je n'avais pas vu.

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.