alors je commence à apprendre le fonctionnement des threads pour pouvoir faire des application réseaux multijoueurs (je vous averti j'y suis aps encore )
j'ai un code
#include <windows.h>
#include <iostream>
#include <stdlib.h>
usingnamespace std;
DWORD WINAPI fonc1(int params)
{
while(1)
{
cout << params << endl;
Sleep(10);
}
return0;
}
DWORD WINAPI fonc2(int params)
{
while(1)
{
cout << params << endl;
Sleep(10);
}
return0;
}
int main()
{
HANDLE h1;
HANDLE h2;
CreateThread(NULL,0,fonc1,1,0,0);
CreateThread(NULL,0,fonc2,2,0,0);
system("PAUSE");
TerminateThread(h1,0);
TerminateThread(h2,0);
system("PAUSE");
return0;
}
mais mon compilo me sort plein d'erreur
erreur : invalid conversion from `DWORD (*)(int)' to `DWORD (*)(void*)'
initializing argument 3 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'
invalid conversion from `int' to `void*'
(il me sort deux fois ces trois erreurs car je crée deux threads)
mais je comprends pas ou il trouve son void* dasn la derniere erreur ! car j'ai bien mis un int dans la parenthèse de la création de threads
si quelqu'un connaissant les threads pouvait m'aider
Oui, c'est vrai, au niveau de la portabilité.
Mais tu ne peux pas dire "ça puxx" sans arguments derriere....
J'utilise les threads Win32, et meme s'ils sont partis pour etre remplacés par une prochaine lib standard, ils m'ont déja rendu de bons services !
Ta fonction n'a tout simplement pas le bon prototype: tu es obligé d'avoir une fonction ayant la signature "`DWORD (*)(void*)" (tiens c'était dit ! )
donc ton code devrait normalement marcher ainsi (je suis pas très "ami" avec l'APIWin32...):
#include <windows.h>
#include <iostream>
#include <stdlib.h>
usingnamespace std;
DWORD WINAPI fonc1(void* params)
{
int param=(int)params;
while(1)
{
cout << param << endl;
Sleep(10);
}
return0;
}
DWORD WINAPI fonc2(void* params)
{
int param=(int) params;
while(1)
{
cout << param << endl;
Sleep(10);
}
return0;
}
int main()
{
HANDLE h1;
HANDLE h2;
CreateThread(NULL,0,fonc1,(void*)1,0,0);
CreateThread(NULL,0,fonc2,(void*)2,0,0);
system("PAUSE");
TerminateThread(h1,0);
TerminateThread(h2,0);
system("PAUSE");
return0;
}
Normalement tu devrais tester si le paramètre n'est pas nul etc...
ton problème vient des signatures de tes fonctions, ça j'en suis sûr ...
après c'est un problème de transtypage des données, le void* accepte tout et n'importe quoi, il suffit de transtyper.
En esperant un peu t'aider.
Attend je me suis peut-être tromper sur un truc bête, je vais éditer mon premier message...
De plus , les threads (en général) ca ne s'utile pas pour dire "J'utilise des threads".
Il faut les utiliser dans des cas bien précis car en utiliser amène des problèmes assez chiant(mutex,synchronisation,rendre les fonction thread-safe...) , ca rend une application difficile a débuguer.
Pour comparer , voici un exemple thread avec boost(portable , C++ pur)
Utilisation de foncteur
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
struct MyThreadFunc {
void operator()(){
// Do something long-running...
}
};
int main(){
MyThreadFunc threadFun;
boost::thread myThread(threadFun); // Create a thread that starts
// running threadFun
boost::thread::yield(); // Give up the main thread's timeslice
// so the child thread can get some work
// done.
// Go do some other work...
myThread.join(); // The current (i.e., main) thread will wait
struct x *param = reinterpret_cast<struct x*>(params);
transtypage version structure
@ davidbrz : je suis d'accord que c'est plus simple vu comme ça mais disons que la barrière linguistique est trop grande pour moi (j'entends déjà le "de toute façon l'anglais faudra t'y mettre un jour ou l'autre" => oui ben c'est en cours mais pas encore assez pour lire toute une doc)
Si vous êtes là que pour troller, vous pouvez partir tout de suite...
@Icare: avant de transtyper, test toujours si le paramètre n'est pas nul. Car c'est le genre de petites choses qui peuvent provoquer de belles erreurs d'executions.
De plus , les threads (en général) ca ne s'utile pas pour dire "J'utilise des threads".
Il faut les utiliser dans des cas bien précis car en utiliser amène des problèmes assez chiant(mutex,synchronisation,rendre les fonction thread-safe...) , ca rend une application difficile a débuguer.
</code>
Non mais franchement...
Ils ne sont pas clair a utiliser : il suffit d'y lire un peu, et ça devient clair. C'est du C, mais rien ne t'empeche de l'encapsuler dans les classes si ça te chante, la gestion des threads sous Unix étant également du C a la base. Il est possible que Boost encapsule tout simplement ça C'est pas portable, je te l'accorde. Quand a la gestion des mutex, etc, j'en connais un rayon la dessus (deadlock), débuggage difficile, etc... Il y a tous les outils qu'il faut pour cela avec l'API Windows
Si je réagis a cela, ce n'est pas pour te dire que WinApi est mieux que Boost, au contraire, je pense que boost est tres bien et va doucement supplanter l'utiliser de la WinAPI directe pour les threads,
mais je réagis a cela, car je pense qu'il ne faut quand meme pas manquer de respect a tous les programmeurs Windows qui ont déja programmé maintes et maintes fois avec la WinAPI.
Il ne faut pas dire "ça pue", il faut dire que tu n'aimes pas.
Non mais franchement...
Ils ne sont pas clair a utiliser : il suffit d'y lire un peu, et ça devient clair. C'est du C, mais rien ne t'empeche de l'encapsuler dans les classes si ça te chante, la gestion des threads sous Unix étant également du C a la base. Il est possible que Boost encapsule tout simplement ça C'est pas portable, je te l'accorde. Quand a la gestion des mutex, etc, j'en connais un rayon la dessus (deadlock), débuggage difficile, etc... Il y a tous les outils qu'il faut pour cela avec l'API Windows
Pour la clairté , disons qu'il faut comprendre la logique avant.
Il 'suffit' d'encapsuler , facile a dire plus difficile a faire.
Les threads unix , c'est aussi du C , mais du 'beau C', ca c'est caca.(comparer)
Ensuite , ya peut être des outils mais un outils avec une main incompétante ne sert a rien.
Pour se servir des threads , il suffit pas de savoir en créet mais avoir aussi une certaine connaissance théorique derière.
Citation : X
Si je réagis a cela, ce n'est pas pour te dire que WinApi est mieux que Boost, au contraire, je pense que boost est tres bien et va doucement supplanter l'utiliser de la WinAPI directe pour les threads,
mais je réagis a cela, car je pense qu'il ne faut quand meme pas manquer de respect a tous les programmeurs Windows qui ont déja programmé maintes et maintes fois avec la WinAPI.
Il ne faut pas dire "ça pue", il faut dire que tu n'aimes pas.
Les threads win32 ca a peut être été le best a une époque mais aujourd'hui il faut le dire , ca pue comparé a ce qu'on a en C++ (bien qu'a la fin , les autres bliothèque vont se reposer la dessue mais on s'en fout).
Non, ça ne m'intéresse pas.
Je ne suis pas la pour débattre de ce genre de choses, et je t'ai déja dit ce que je voulais te dire plus haut, d'autant plus quand le débat commence par un rejet total associé au mot "ça pue".
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html