Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

THREAD DANS UNE CLASS C++


Information sur la source

Catégorie :Tutoriaux Classé sous : thread, class Niveau : Initié Date de création : 15/01/2006 Date de mise à jour : 16/01/2006 12:27:47 Vu : 17 339

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

  • 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;
  • }
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;
}

Historique

16 janvier 2006 12:27:47 :
changement de categorie

Commentaires et avis

signaler à un administrateur
Commentaire de vecchio56 le 15/01/2006 12:48:21 administrateur CS

Tu aurais pu aussi bien mettre ceci comme tutorial, et aussi insister sur la raison pour laquelle les fonction XCriticalSection sont importantes (en particulier pourquoi un simple booléen ne suffit pas)
Tu aurais pu mettre ThreadStart dans la classe (mais en static)

signaler à un administrateur
Commentaire de sephiro le 16/01/2006 08:12:36

Il y a de nombreux messages sur ce site qui explique le pourquoi de l'utilisation des fonctions CriticalSection, le but de ce post n'est pas ce type de fonctions. Par compte mettre la fonction en static dans ma Class !!! peux tu m'expliquer ça. Car la mettre en Public ou private ne fonctionne pas.
Merci

signaler à un administrateur
Commentaire de DeAtHCrAsH le 16/01/2006 10:24:50

Ptite remarque concernant le titre du post.
Mets C++ plutot que C, car une class ne peut pas etre en C.

Shell

signaler à un administrateur
Commentaire de neria le 16/01/2006 11:29:53

Petite astuce : pour avoir une fonction de type thread (DWORD WINAPI ...) intégrée dans la classe il suffit de la déclarer en static, ce qui supprime le passage implicite du this lors de l'appel et rend ainsi la signature valide.

signaler à un administrateur
Commentaire de DeAtHCrAsH le 17/01/2006 14:29:45

Neria> Deja dis, cf plus haut le post de vecchio56

signaler à un administrateur
Commentaire de neria le 17/01/2006 17:55:28

Désolé je n'avais pas vu.

signaler à un administrateur
Commentaire de yahyaoui_oussama le 05/07/2006 15:22:17

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

signaler à un administrateur
Commentaire de sephiro le 17/07/2006 08:53:35

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)

signaler à un administrateur
Commentaire de hugo_cpp le 31/07/2006 12:36:44

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

signaler à un administrateur
Commentaire de sephiro le 21/08/2006 10:03:18

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Thread d'une class [ par xytron ] Bonjour je recherche le moyen de "threader" une classe, j'ai testé plusieurs trucs mais je dois pas avoir trouvé le bon alors si vous pouviez m'aider Class & CreateThread [ par Renfield ] Bonjour, j'ai un petit soucis de compilation...dans une classe, je voudrais créer un Thread. ma proc est définie comme cela :LPTHREAD_START_ROUTINE Fonctions & Thread .... [ par DeAtHCrAsH ] Lu all,Je dispose d'une class qui possède un thread.J'aimerai que lorsque j'appelle les fonctions membres de la class, celle ci s'execu Cross-thread operation [ par hrp ] Bonjour,j'aimerai créer une class possédant des événements. Cette class lance également un thread qui va déclancher l'événement. Dans le code où est i modifier un label dans un thread? [ par catamenia ] bonjour,comment on modifie la valeur d'un label dans un thread en c++?j'ai passé la variable associée a mon thread mais je ne peux pas faire de update Interaction entre objets [ par kharrat ] Salut,Je cherche à implémenter une relation d'association 1-1 entre 2 objets de 2 classes différentes.Mon code:--------------------------------------- Probleme de compilaton [ par hypocastor ] Bonjour,J'ai un probleme lors de la compilation avec borland pour mes class. Je pense que c'est tout bete mais je ne voit pas ou c'est. Voici la class Accessing Class Members From the Static Member Function [ par soficher ] Salut tt le monde;merci de me montrer comment je peux acceder aux membres variable depuis une static methode, de la meme classe;Class CMyClass{public: pb thread et progressbar [ par mrous ] Bonjour,J'ai un problème avec le multithreading, je souhaite modifier l'avancement d'une progressbar dans un thread. Pour cela, j'utilise AfxBeginThre TrackPopupMenu ListView et thread [ par chris91 ] bonjour,j'utilise TrackPopupMenu sur notification de clic droit avec une listview...cela fonctionne parfaitement si aucun message n'arrive à la listvi


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.