BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
30 janv. 2004 à 19:52
Utilisateur anonyme -
10 avril 2010 à 19:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Ce source m'interesse mais lors de la compilation, ça boggue. Je suis sous visual c++ 2008. J'ai ouvert un projet console, j'ai bien mis _MT comme option, rien ne change. Pourrai-je avoir un peu d'aide, s'il vous plaît ^^.
Merci
Zakata
Messages postés59Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention17 juillet 2009 14 mars 2010 à 17:17
Bonjour,
Merci pour la source ça vas me servir. Je suis d'accord avec toi ; c'est intéressant d'avoir un objet thread.
J'ai une petite remarque :
Le programme de test lève une exception après : "Demande d'arrêt du compteur numéro 3".
J'ai essayé de mettre : monTemps3.Attendre(); après l'arrêt mais sans succès.
J'ai du remplacer un bout de code pour que ça marche : (je me suis passé des exceptions)
Sinon, sais tu combien de thread peux t-on créer dans un soft ?
Pour info la sortie de g++ -v :
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
agua2
Messages postés6Date d'inscriptionjeudi 3 septembre 2009StatutMembreDernière intervention10 mars 2010 10 mars 2010 à 04:07
Merci. Je vais continuer mon développement dans ce sens. Sinon, ton code pour le thread simple, avec les nuances de compil décrites pour VC++6, marche parfaitement bien sûr. Merci aussi pour ça.
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 10 mars 2010 à 00:34
A priori, la compilation ne devrait pas poser de problème. J'avais déjà MinGW au moment du développement de ce projet.
agua2
Messages postés6Date d'inscriptionjeudi 3 septembre 2009StatutMembreDernière intervention10 mars 2010 9 mars 2010 à 23:30
Merci bien. Je vais essayer ça. Est-ce que le code source de cette page concernant les Threads est intégralement utilisable tel quel avec ce compilateur et l'atelier MinGW?
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 9 mars 2010 à 23:23
Actuellement, je développe avec MinGW (GCC pour Win) et j'utilise les librairies open source telles que WxWidgets. Ca me permet de faire un code assez portable tout en pouvant le compiler en 32 ou 64 bits lorsque je suis sous windows. Le support du C++ est correct.
agua2
Messages postés6Date d'inscriptionjeudi 3 septembre 2009StatutMembreDernière intervention10 mars 2010 9 mars 2010 à 23:08
Je suis bien d'accord avec toi!! C'est une souffrance incroyable... Par contre, je n'ai pas assez de sous pour renouveler mon "atelier" et j'essaie de me débrouiller avec. Connais-tu un bon compilo C++ valable et qui offre une bonne librairie de classes (y compris les threads et les sockets) tout en supportant Windows XP?
Merci d'avance de tes conseils.
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 9 mars 2010 à 21:48
VC6 est une catastrophe en terme de respect du standard C++. Je t'invite à changer de compilateur si tu en as la possibilité !
agua2
Messages postés6Date d'inscriptionjeudi 3 septembre 2009StatutMembreDernière intervention10 mars 2010 9 mars 2010 à 21:28
Autre commentaire pour la compilation sous Visual C++ 6: dans les "Project Settings", sous le tag "C++", il faut ajouter:
1) "_MT" dans les "Preprocessor definitions"; (pour que _beginthreadex soit trouvé dans process.h)
2) et "/MDd" dans ses "Project Options" (pour résoudre __unlock)
agua2
Messages postés6Date d'inscriptionjeudi 3 septembre 2009StatutMembreDernière intervention10 mars 2010 9 mars 2010 à 20:40
J'essaie de compiler ce code très intéressant sous Visual C++ 6 (en ajoutant #include <windows.h> pour HANDLE), mais la compil ne passe pas. Voici les erreurs:
Thread.cpp
...\thread.h(92) : error C2244: 'x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>' : unable to resolve function overload
...\thread.h(94) : error C2954: template definitions cannot nest
...\thread.h(101) : error C2244: 'x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>' : unable to resolve function overload
...\thread.h(103) : error C2954: template definitions cannot nest
...\thread.cpp(70) : error C2065: '_beginthreadex' : undeclared identifier
Comment fais-tu pour "nester" ces classes templates sans erreur?
ordiman85
Messages postés41Date d'inscriptionsamedi 4 mars 2006StatutMembreDernière intervention19 mars 2010 7 juin 2008 à 11:59
Super bon boulot je te mets 10/10, je vais de plus utiliser ta source, merci
Helldream
Messages postés29Date d'inscriptionmercredi 14 juin 2006StatutMembreDernière intervention 6 février 2009 7 nov. 2007 à 01:14
Je cherchais une classe de ce genre pour m'en inspirer, et visiblement je l'ai trouvée :)
Merci pour ton apport!
wadcyr8_197
Messages postés23Date d'inscriptionvendredi 24 novembre 2000StatutMembreDernière intervention 2 septembre 2007 25 juil. 2007 à 11:29
Salut,
je suis confronté à un nouveau problème avec l'utilisation des threads !
j'ai un prog main qui se charge de lancer 2 threads et de se met en sleep derrière.
Le premier thread ouvre une connexion telnet pour passer des instructions à une machine distante de façon à ce qu'elle envoie des info sur une socket particulière, le deuxième thread écoute sur cette socket et récupère des messages xml dessus, le troisième récupère ces messages xml et les parse.
j'ai un petit problème quand mon main quitte sont sleep, il se termine (normal) et provoque la fin de mes threads (normal aussi), le truc c'est qu'il me provoque un crash de mon troisième.
je n'arrive pas à utiliser gdb pour voir exactement où se situe le problème et de quel type il s'agit, mais avec des cout, j'ai pu voir que c'était à la fin de mon main et lorsque mon thread parseur s'apprète à faire un découpage que ça merde.
si quelqu'un peut m'aider
merci bien
Wad
ps : je précise que j'utilise codeblocks sous windows
wadcyr8_197
Messages postés23Date d'inscriptionvendredi 24 novembre 2000StatutMembreDernière intervention 2 septembre 2007 20 juil. 2007 à 10:15
merci, mais c'est pas ça, en fait je viens de trouver, c'est juste que j'avais un static qui trainait d'une part à la déclaration de ma fonction et ensuite il n'aime pas les constructeurs qui ont besoin d'argument :d
cs_crunch117
Messages postés7Date d'inscriptiondimanche 22 mai 2005StatutMembreDernière intervention16 juillet 2007 19 juil. 2007 à 17:30
Regarde bien si ta fonction Telnet::initialization possède ce prototype dans la déclaration de ta classe :
void initialization();
++
wadcyr8_197
Messages postés23Date d'inscriptionvendredi 24 novembre 2000StatutMembreDernière intervention 2 septembre 2007 16 juil. 2007 à 13:43
Salut,
merci bien pour cette petite classe c'est exactement ce qu'il me fallait. Seulement j'ai quelques problème à l'utilisation. Lorsque je mets ceci :
x_Filament_Ameliore<Telnet> fil_telnet(&connexion_telnet, void &Telnet::initialization() );
c'est comme ce que faisait ERACIUS, j'obtiens une erreur différence de la sienne :
error: expected primary-expression before "void"
si je mets ta correction à son problème :
x_Filament_Ameliore<Telnet> fil_telnet(&connexion_telnet, &Telnet::initialization );
j'obtiens :
error: no matching function for call to `x_Filament_Ameliore<Telnet>::x_Filament_Ameliore(Telnet*, void (*)())'
là je comprends ce qui ne lui plait pas, mais je ne vois pas où est l'erreur ?
si quelqu'un peut m'aider
merci d'avance
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 5 févr. 2007 à 23:59
Bonjour, merci pour ce commentaire.
En relisant le code, je trouve effectivement que la notation est perfectible.
Pour la pause, j'avoue ne pas avoir le temps de rafraichir le source. Sais tu t'en occcuper ?
Merci.
cyfive
Messages postés14Date d'inscriptionvendredi 28 juillet 2006StatutMembreDernière intervention10 août 2006 4 janv. 2007 à 06:03
Bravo pour ces 2 classes. Ca faisait longtemps que je cherchais comment faire des thread sous windows avec DevCPP. Un grand merci. J'ai une recommendation à faire: est-ce que tu pourrais ajouter des méthodes à ta classe de base afin que l'on puisse faire une pause à notre thread et ensuite une autre pour continuer la thread. J'ai vu ça avec la VCL de Borland et je trouverais ça interressant.
Autre chose, je trouve ta convention de nommage pas très claire. Pour faciliter la compréhension j'ai du traduire tes 2 classes.
En tout cas chacun sa convention. :)
cs_Ange44
Messages postés4Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention 5 septembre 2006 16 août 2006 à 13:43
Merci, mais en fait j'avais trouvé il me fallait compiler en MultiThread en effet ;)
Sinon je dois rester sous VS 2003 .NET à cause de biblliothèques que j'utilise (développées en interne, et pour le moment non compatible avec VS supérieur à 2003 .NET :() Enfin ça ne m'empêche pas de bosser ;)
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 16 août 2006 à 12:36
Tu devrais passer sous VS8 Express qui est gratuit.
Il me semble que HANDLE appartient à windows.h. Compile/Link en multi-thread.
Le code doit se trouver dans un .h qui est "includé" dans chaque source qui utilise mes classes. L'Export Template n'est pas d'actualité.
Des exemples sont fournis avec le source (main.cpp).
Bonne chance.
cs_Ange44
Messages postés4Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention 5 septembre 2006 16 août 2006 à 11:31
Salut !
J'ai mis du temps à trouver mais grace à ta classe j'ai enfin trouvé une interface simple pour faire des threads portables !
Par contre j'ai un petit problème, quand j'essaye de compiler ton programme sous VS 2003 .NET il me dit qu'il ne connait pas HANDLE (et d'autres trucs). Y a-t-il des includes supplémentaires à ajouter ?
Sinon je ne compte utiliser que les x_Filament_Ameliore mais il plante au linkage dans mon code car il n'a pas le code (vu qu'il arrive à compiler tes sources :( )
Si tu as une idée ?
worms4
Messages postés27Date d'inscriptionjeudi 29 avril 2004StatutMembreDernière intervention20 mars 2007 8 mars 2006 à 12:44
Je comprend essensielment bien le but de ta classe et c'est pour cela que je la trouve très très interessente mais si tu pouvais rajouter quelque exemple pour bien comprendre l'utilisation de chacune de tes fonction je t'en serais grandement reconnaissent.
Et bonne RTT
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 26 déc. 2004 à 19:44
Et cà ?
x_Filament_Ameliore<vehicule> monfil(&clio, &vehicule::avance );
cs_eracius
Messages postés2Date d'inscriptionsamedi 25 décembre 2004StatutMembreDernière intervention26 décembre 2004 26 déc. 2004 à 19:31
salut à toi et merci pour cette classe, c exactement ce qu'il me fallait.
Seulement voila, je dois etre un gros boulet mais j'arrive po à m'en servir.
j'ai mis ceci :
x_Filament_Ameliore<vehicule> monfil(&clio, void &vehicule::avance() );
Et il dit "parse error before "&" token"
alors j'enlève le & devant vehicule et il met :
"parse error before "::" token"
vois-tu le problème ? merci :)
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 30 janv. 2004 à 20:01
Merci ... et bonne question :)
L'idée est d'avoir une même interface (une même classe thread) pour Win32 et GNU/Linux. Une interface de haut niveau au passage et si possible orienté objet (enfin presque...taz si tu m'ecoutes? pardon!).
D'autre part, cela améliore un peu la lisibilité du code puisque les appels des threads et la gestion des identifiants de threads devient transparente.
Enfin, cette classe offre au débutant la possibilité de créer des threads rapidement sans même connaitre la syntaxe des appels posix ou win32. Enfin, attention qd même les classe dérivées de ma classe Filament ne sont pas automatiquement "thread safe" bien sur!
Et puis je suis en RTT depuis hier alors fallait que je m'occupe :)
Cordialement,
Xter!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 30 janv. 2004 à 19:52
Salut,
d'abord bravo pour le travail.
Mais enfin c'est le but qui m'echappe. Pourquoi faire complique quand l'original est simple, je parle pour win32 seulement ?
10 avril 2010 à 19:28
7 avril 2010 à 23:06
7 avril 2010 à 20:42
Merci
14 mars 2010 à 17:17
Merci pour la source ça vas me servir. Je suis d'accord avec toi ; c'est intéressant d'avoir un objet thread.
J'ai une petite remarque :
Le programme de test lève une exception après : "Demande d'arrêt du compteur numéro 3".
J'ai essayé de mettre : monTemps3.Attendre(); après l'arrêt mais sans succès.
J'ai du remplacer un bout de code pour que ça marche : (je me suis passé des exceptions)
#ifdef WIN32
unsigned __stdcall x_Filament::Filament( void * pthis ) {
#else
void * x_Filament::Filament( void * pthis ) {
#endif
//try
if(pthis!=NULL){
x_Filament * pParent = (x_Filament*)pthis;
pParent->bExecution = true;
pParent->Traitement();
}
//catch(...)
//{
//}
#ifdef WIN32
return(0);
//_endthreadex(0);
#else
pthread_exit(0);
#endif
}
Sinon, sais tu combien de thread peux t-on créer dans un soft ?
Pour info la sortie de g++ -v :
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
10 mars 2010 à 04:07
10 mars 2010 à 00:34
9 mars 2010 à 23:30
9 mars 2010 à 23:23
9 mars 2010 à 23:08
Merci d'avance de tes conseils.
9 mars 2010 à 21:48
9 mars 2010 à 21:28
1) "_MT" dans les "Preprocessor definitions"; (pour que _beginthreadex soit trouvé dans process.h)
2) et "/MDd" dans ses "Project Options" (pour résoudre __unlock)
9 mars 2010 à 20:40
Thread.cpp
...\thread.h(92) : error C2244: 'x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>' : unable to resolve function overload
...\thread.h(94) : error C2954: template definitions cannot nest
...\thread.h(101) : error C2244: 'x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>::x_Filament_Ameliore<T_CLASSE>' : unable to resolve function overload
...\thread.h(103) : error C2954: template definitions cannot nest
...\thread.cpp(70) : error C2065: '_beginthreadex' : undeclared identifier
Comment fais-tu pour "nester" ces classes templates sans erreur?
7 juin 2008 à 11:59
7 nov. 2007 à 01:14
Merci pour ton apport!
25 juil. 2007 à 11:29
je suis confronté à un nouveau problème avec l'utilisation des threads !
j'ai un prog main qui se charge de lancer 2 threads et de se met en sleep derrière.
Le premier thread ouvre une connexion telnet pour passer des instructions à une machine distante de façon à ce qu'elle envoie des info sur une socket particulière, le deuxième thread écoute sur cette socket et récupère des messages xml dessus, le troisième récupère ces messages xml et les parse.
j'ai un petit problème quand mon main quitte sont sleep, il se termine (normal) et provoque la fin de mes threads (normal aussi), le truc c'est qu'il me provoque un crash de mon troisième.
je n'arrive pas à utiliser gdb pour voir exactement où se situe le problème et de quel type il s'agit, mais avec des cout, j'ai pu voir que c'était à la fin de mon main et lorsque mon thread parseur s'apprète à faire un découpage que ça merde.
si quelqu'un peut m'aider
merci bien
Wad
ps : je précise que j'utilise codeblocks sous windows
20 juil. 2007 à 10:15
19 juil. 2007 à 17:30
void initialization();
++
16 juil. 2007 à 13:43
merci bien pour cette petite classe c'est exactement ce qu'il me fallait. Seulement j'ai quelques problème à l'utilisation. Lorsque je mets ceci :
x_Filament_Ameliore<Telnet> fil_telnet(&connexion_telnet, void &Telnet::initialization() );
c'est comme ce que faisait ERACIUS, j'obtiens une erreur différence de la sienne :
error: expected primary-expression before "void"
si je mets ta correction à son problème :
x_Filament_Ameliore<Telnet> fil_telnet(&connexion_telnet, &Telnet::initialization );
j'obtiens :
error: no matching function for call to `x_Filament_Ameliore<Telnet>::x_Filament_Ameliore(Telnet*, void (*)())'
là je comprends ce qui ne lui plait pas, mais je ne vois pas où est l'erreur ?
si quelqu'un peut m'aider
merci d'avance
5 févr. 2007 à 23:59
En relisant le code, je trouve effectivement que la notation est perfectible.
Pour la pause, j'avoue ne pas avoir le temps de rafraichir le source. Sais tu t'en occcuper ?
Merci.
4 janv. 2007 à 06:03
Autre chose, je trouve ta convention de nommage pas très claire. Pour faciliter la compréhension j'ai du traduire tes 2 classes.
En tout cas chacun sa convention. :)
16 août 2006 à 13:43
Sinon je dois rester sous VS 2003 .NET à cause de biblliothèques que j'utilise (développées en interne, et pour le moment non compatible avec VS supérieur à 2003 .NET :() Enfin ça ne m'empêche pas de bosser ;)
16 août 2006 à 12:36
Il me semble que HANDLE appartient à windows.h. Compile/Link en multi-thread.
Le code doit se trouver dans un .h qui est "includé" dans chaque source qui utilise mes classes. L'Export Template n'est pas d'actualité.
Des exemples sont fournis avec le source (main.cpp).
Bonne chance.
16 août 2006 à 11:31
J'ai mis du temps à trouver mais grace à ta classe j'ai enfin trouvé une interface simple pour faire des threads portables !
Par contre j'ai un petit problème, quand j'essaye de compiler ton programme sous VS 2003 .NET il me dit qu'il ne connait pas HANDLE (et d'autres trucs). Y a-t-il des includes supplémentaires à ajouter ?
Sinon je ne compte utiliser que les x_Filament_Ameliore mais il plante au linkage dans mon code car il n'a pas le code (vu qu'il arrive à compiler tes sources :( )
Si tu as une idée ?
8 mars 2006 à 12:44
Et bonne RTT
26 déc. 2004 à 19:44
x_Filament_Ameliore<vehicule> monfil(&clio, &vehicule::avance );
26 déc. 2004 à 19:31
Seulement voila, je dois etre un gros boulet mais j'arrive po à m'en servir.
j'ai mis ceci :
x_Filament_Ameliore<vehicule> monfil(&clio, void &vehicule::avance() );
Et il dit "parse error before "&" token"
alors j'enlève le & devant vehicule et il met :
"parse error before "::" token"
vois-tu le problème ? merci :)
30 janv. 2004 à 20:01
L'idée est d'avoir une même interface (une même classe thread) pour Win32 et GNU/Linux. Une interface de haut niveau au passage et si possible orienté objet (enfin presque...taz si tu m'ecoutes? pardon!).
D'autre part, cela améliore un peu la lisibilité du code puisque les appels des threads et la gestion des identifiants de threads devient transparente.
Enfin, cette classe offre au débutant la possibilité de créer des threads rapidement sans même connaitre la syntaxe des appels posix ou win32. Enfin, attention qd même les classe dérivées de ma classe Filament ne sont pas automatiquement "thread safe" bien sur!
Et puis je suis en RTT depuis hier alors fallait que je m'occupe :)
Cordialement,
Xter!
30 janv. 2004 à 19:52
d'abord bravo pour le travail.
Mais enfin c'est le but qui m'echappe. Pourquoi faire complique quand l'original est simple, je parle pour win32 seulement ?