CreateThread template [Résolu]

Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
- - Dernière réponse : Pistol_Pete
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
- 7 janv. 2011 à 08:54
Bonjour à tous,

Je cherche à multithreader une fonction template. L'exemple qui suit est un petit exemple de ce que je souhaite faire.

J'obtiens l'erreur de compilation suivante :
'CreateThread' : cannot convert parameter 3 from 'DWORD(LPVOID)' to 'LPTHREAD_START_ROUTINE'


Il t'il possible de faire cela?
Merci

template  <typename T>
  class Multithreading
{
 public:
Multithreading(T Value);
DWORD WINAPI MyFunc(LPVOID lParam);

};


template  <typename T>
Multithreading<T>::Multithreading(T Value)
{
CreateThread(0,0,Multithreading<T>::MyFunc,0,0,0);
}

template<typename T>
  DWORD WINAPI Multithreading<T>::MyFunc(LPVOID lParam)
{
return 0;
}


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
3
Merci
Salut à tous et bonne année.

Pistol_Pete, tu peux multithreader une fonction template, mais tu ne peux pas caster une méthode d'objet en une fonction même si les prototypes semblent identiques. En revanche, il est possible d'utiliser une méthode de classe en lieu et place d'une fonction.

En clair voilà ce que tu peux donner à manger à la fonction CreateThread :

template<typename T>
DWORD WINAPI MyFunc(LPVOID lParam)
{
    return 0;
}
...
CreateThread(0,0,MyFunc,0,0,0);


ou

template<typename T>
class Multithreading
{
    public:
        Multithreading(T Value);
static DWORD WINAPI MyFunc(LPVOID lParam)
        {
            return 0 ;
        }
};
...
...
CreateThread(0,0,Multithreading::MyFunc,0,0,0);



Cordialement.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Lucky92
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
salut,

J'ai appelé Bill, il m'a dit cela:

Do not declare this callback function with a void return type and cast the function pointer to LPTHREAD_START_ROUTINE when creating the thread. Code that does this is common, but it can crash on 64-bit Windows.


@++
Commenter la réponse de cs_patatalo
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
De plus:
hthrd = CreateThread(...);

Si tu ne récuperes pas hthrd, comment tu feras le CloseHandle() pour liberer la memoire ?

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
0
Merci
@brunews Je suis bien d'accord pour le CloseHandle, je voulais juste montrer le code qui me pose soucis...

@patatalo, Ma fonction n'est pas void et je ne la cast pas...

Il doit bien y avoir un moyen de multithreader une fonction template non?
Merci
A+
____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
Il faut que tu revoie ton anglais, ce n'est pas la class qu'il faut caster mais le pointeur vers threadproc.
Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
C'est cela que tu ne veux absolument pas faire ?

CreateThread(0,0,(LPTHREAD_START_ROUTINE) Multithreading<T>::MyFunc,0,0,0);
Commenter la réponse de cs_patatalo
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
0
Merci
Où j'ai écrit que je voulais caster la classe!?
De toute façon le cast ne fonctionne pas. (impossible de convertir de "overloaded function" to 'LPTHREAD_START_ROUTINE')

Je réitère ma question : est t'il possible de multithreader une fonction template?

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
0
Merci
Merci beaucoup Lucky92!
Il me manquait effectivement le static...
Merci également à Brunews et à Patatalo.

A+ et bonne année à tous.

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
bon alors, 1 partout la balle au centre :)

Je ne connais pas tres bien le c++ mais l'ennui va être que tu vas devoir creer une fonction statique pour chaque type T.

Tu n'es pas le premier à te poser la question sur google.

J'ai vu des trucs du style passer le pointeur this en lParam et declarer T *objet dans la classe afin de recuperer le type je dans la fonction statique je supposes.

Aussi, creer un nouveau type de callback afin d'inclure d'autres parametres au callback original.

En programmation, je pense qu'il ne doit pas y avoir grand chose d'impossible. Après, ça peut être capilotracté.

@++
Commenter la réponse de cs_patatalo
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
C'est ce que fait le compilo en C++, il crée 1 fonction par type T.
Les arguties de haut niveau sont toujours ramenées en interne à du code pur et dur.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
0
Merci
Oui c'est là le seul avantage des templates: laisser le compilateur faire les copiés/collés des fonctions avec les bons types (quand il en a besoin!)

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete