CreateThread template

Résolu
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 4 janv. 2011 à 17:48
Pistol_Pete Messages postés 1053 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.

11 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
5 janv. 2011 à 15:08
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.
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
4 janv. 2011 à 23:33
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.


@++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 janv. 2011 à 00:21
De plus:
hthrd = CreateThread(...);

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

ciao...
BruNews, MVP VC++
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 janv. 2011 à 09:03
@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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 janv. 2011 à 13:25
Il faut que tu revoie ton anglais, ce n'est pas la class qu'il faut caster mais le pointeur vers threadproc.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 janv. 2011 à 13:27
C'est cela que tu ne veux absolument pas faire ?

CreateThread(0,0,(LPTHREAD_START_ROUTINE) Multithreading<T>::MyFunc,0,0,0);
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 janv. 2011 à 13:41
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.
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 janv. 2011 à 15:18
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.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 janv. 2011 à 00:19
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é.

@++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 janv. 2011 à 01:31
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++
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
7 janv. 2011 à 08:54
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.
0
Rejoignez-nous