CreateThread template [Résolu]

Signaler
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
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.

11 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
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.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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.


@++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
De plus:
hthrd = CreateThread(...);

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

ciao...
BruNews, MVP VC++
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
@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.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
Il faut que tu revoie ton anglais, ce n'est pas la class qu'il faut caster mais le pointeur vers threadproc.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
C'est cela que tu ne veux absolument pas faire ?

CreateThread(0,0,(LPTHREAD_START_ROUTINE) Multithreading<T>::MyFunc,0,0,0);
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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é.

@++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.