Classe cthread

Soyez le premier à donner votre avis sur cette source.

Vue 10 270 fois - Téléchargée 2 925 fois

Description

Cette classe s'inspire de la classe Thread de Java. Elle peut aussi servir d'exemple de classe virtuelle.
Pour l'utiliser, il suffit de créer une classe, de la faire hériter de la classe CThread et de surcharger la méthode Run.

Source / Exemple :


#pragma once

#include <windows.h>

#define WM_STOPTHREAD WM_USER

class CThread
{
	public:
		enum Priority
		{
			Basse = THREAD_PRIORITY_LOWEST,
			Normale = THREAD_PRIORITY_NORMAL,
			Critique = THREAD_PRIORITY_TIME_CRITICAL,
			TempsReel = REALTIME_PRIORITY_CLASS
		}Priority;

	private:
		HANDLE m_hThread;
		DWORD m_dwThreadId;
		BOOL m_bActif;

		//thread
		friend DWORD WINAPI Thread(LPVOID pParam);

	protected:
		//fonction virtuelle appelée par le thread
		virtual void Run(void) = 0;

	public:
		//constructeur
		CThread();
		//destructeur
		~CThread();
		
		//lancer le thread
		void Start(void);
		//arrêter le thread
		void Stop(DWORD dwTimeOut = INFINITE);
		//terminer le thread (brutal)
		void Terminate(void);
		//changer la priorité
		void SetPriority(int iPriority) const;
		//retourne l'activité du thread
		BOOL IsRunning(void) const;
		//retourne le handle du thread
		HANDLE GetHandle(void) const;
		//retourne l'identifiant du thread
		DWORD GetID(void) const;

		//attend la fin du thread
		DWORD Wait(DWORD dwTimeOut) const;
};

Codes Sources

Ajouter un commentaire Commentaires
Messages postés
10
Date d'inscription
vendredi 12 novembre 2004
Statut
Membre
Dernière intervention
23 novembre 2008

Salut, c'est intéressant de regarder ta source car j'ai implémenté une classe de thread similaire, modulo quelques détails.

Notamment, la boucle de message est implémentée par ma classe de base. MA classe dérivée ne doit pas implémenter un Run() mais plutôt un OnMessage( Message* ).
Je peux donc créer un thread "inactif" et lui donner du travail via un .PostMessage( Message* ) (méthode de ma classede base, qui s'occupe de l'appel à l'API Win32). Du coup je n'ai nul besoin de méthodes GetHandle ou GetID, l'API est totalement encapsulée.

Si l'envoi d'un message a réussi, il est possible de faire un .Wait() sur le message pour attendre que le thread ait terminé de le traiter. Cela vient en plus du .Wait() de fermeture du thread.

a+
Messages postés
69
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
23 avril 2009

Bonjour,

Regardes avec les objets thread de la stdlib qu'il serait possible d'encapsuler dans une classe telle que celle-ci.
Messages postés
1
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
10 mars 2008

Bonjour!

Classe très utile!!
Tu n'aurais pas d'équivalent sous linux?

merci
Messages postés
69
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
23 avril 2009

-->

Il y a quelques autres modifs, je te conseille de re-télécharger le nouveau code.
Messages postés
69
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
23 avril 2009

Effectivement, j'avais corrigé ces erreurs mais apparement l'upload du nouveau code ne s'est pas passé correctement.
Voilà qui est fait !

Voici le code correct :
DWORD WINAPI Thread(LPVOID pParam)
{
//appeler la méthode run
((CThread*)pParam)->Run();

return 0;
}
Afficher les 17 commentaires

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.