begin process at 2012 05 29 02:28:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

CreateThread template


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

CreateThread template

mardi 4 janvier 2011 à 17:48:04 | CreateThread template

Pistol_Pete

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 :
[size=70]'CreateThread' : cannot convert parameter 3 from 'DWORD(LPVOID)' to 'LPTHREAD_START_ROUTINE'[/size]

Il t'il possible de faire cela?
Merci

Code C/C++ :
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.
mardi 4 janvier 2011 à 23:33:21 | Re : CreateThread template

patatalo

Membre Club Administrateur CodeS-SourceS
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.


@++
mercredi 5 janvier 2011 à 00:21:21 | Re : CreateThread template

BruNews

Administrateur CodeS-SourceS
De plus:
hthrd = CreateThread(...);

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

ciao...
BruNews, MVP VC++
mercredi 5 janvier 2011 à 09:03:42 | Re : CreateThread template

Pistol_Pete

@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.
mercredi 5 janvier 2011 à 13:25:13 | Re : CreateThread template

patatalo

Membre Club Administrateur CodeS-SourceS
Il faut que tu revoie ton anglais, ce n'est pas la class qu'il faut caster mais le pointeur vers threadproc.
mercredi 5 janvier 2011 à 13:27:55 | Re : CreateThread template

patatalo

Membre Club Administrateur CodeS-SourceS
C'est cela que tu ne veux absolument pas faire ?

CreateThread(0,0,(LPTHREAD_START_ROUTINE) Multithreading<T>::MyFunc,0,0,0);
mercredi 5 janvier 2011 à 13:41:53 | Re : CreateThread template

Pistol_Pete

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.
mercredi 5 janvier 2011 à 15:08:40 | Re : CreateThread template

Lucky92

Réponse acceptée !
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 :

Code C/C++ :
template<typename T>
DWORD WINAPI MyFunc(LPVOID lParam)
{
    return 0;
}
...
CreateThread(0,0,MyFunc<int>,0,0,0);


ou

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



Cordialement.
mercredi 5 janvier 2011 à 15:18:59 | Re : CreateThread template

Pistol_Pete

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.
vendredi 7 janvier 2011 à 00:19:09 | Re : CreateThread template

patatalo

Membre Club Administrateur CodeS-SourceS
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é.

@++

1 2

Cette discussion est classée dans : template, multithreading, size, dword, createthread


Répondre à ce message

Sujets en rapport avec ce message

Pb avec CreateThread !!! [ par jujunio ] Bonjour, J'ai toujours le même pb avec la création d'une tâche!!MON PROG :DWORD WINAPI Blick::lireCOM(LPVOID ptr){ while (1){...}}int Blick::appli(){ Class ou pas Class la est la question! [ par frdestroyers27 ] Bon je lisait un livre sur la programmation de jeux pour windows dedans l'auteur écrit qu'il est préférable de ne pas utilisé de class. j'aimerais sav Chemin de l'application courante [ par Kdjo ] Comment fait-on pour que l'application qu'on lance connaisse son chemin d'accès quelque soit l'endroit où elle est lancée ? REG_DWORD [ par Xentor609 ] Lorsque je recupere la valeur d'une clé avec RegEnumValue,celle-ci doit etre stockée dans un BYTE. Quand le type de la valeur recupérée est un REG_SZ, c koi un template ??? [ par Arkko ] je vois plusieurs source qui utilisent les templates... mais qu'est ce que c'est ...... ou plutot comment s'en servir ??? SplitterWindow, pour quoi ca marche pas ?? [ par gooopil ] Hello, voila, le code suivant me genere un "debug assertion failed". Code : BOOL CMainFrame::onCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateCon Erreur de link en utilisant les templates [ par Wett ] Voila j'utilise VC++ 6 et j'ai créé une classe templates toute simple (en fait c une liste chainée :p), de la formedans le .h:template class ChainList Mettre un fichier .exe dans un buffer [ par guiguikun ] Je n'arrive pas a mettre un fichier executable en memoire.sur les 100Ko du fichier, mon buffer ne compte que les 3 premiers octets (caracteres)voici m Suppression de l'éxécutable apres éxécution [ par azerty25 ] lu all !!Je suis un gros nul en prog et j'aurais besoin de votre aide pour me donner un petit code qui supprimerai mon éxécutable quand son éxécution array size too large [ par gameking ] Bonjour à vous, voici mon probleme. Dans mon programmr j'ai une structure et lorsque je la compile j'ai l,euueur array size too large. Je veux garder


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 10,998 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales