[WIN32 & LINUX] THREADS C++

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

https://codes-sources.commentcamarche.net/source/19908-win32-linux-threads-c

Utilisateur anonyme
10 avril 2010 à 19:28
C'est juste un soucis d'entete... j'ai tout mis dans un meme fichier dans un certain ordre, it work!
Zakata Messages postés 59 Date d'inscription lundi 21 août 2006 Statut Membre Dernière intervention 17 juillet 2009
7 avril 2010 à 23:06
Donne nous les messages d'erreurs que donne le compilateur
Utilisateur anonyme
7 avril 2010 à 20:42
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és 59 Date d'inscription lundi 21 août 2006 Statut Membre Dernière intervention 17 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)

#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)
agua2 Messages postés 6 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 10 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 6 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 10 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 6 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 10 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 6 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 10 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és 6 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 10 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és 41 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 19 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és 29 Date d'inscription mercredi 14 juin 2006 Statut Membre Derniè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és 23 Date d'inscription vendredi 24 novembre 2000 Statut Membre Derniè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és 23 Date d'inscription vendredi 24 novembre 2000 Statut Membre Derniè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és 7 Date d'inscription dimanche 22 mai 2005 Statut Membre Dernière intervention 16 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és 23 Date d'inscription vendredi 24 novembre 2000 Statut Membre Derniè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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 14 Date d'inscription vendredi 28 juillet 2006 Statut Membre Dernière intervention 10 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és 4 Date d'inscription vendredi 18 novembre 2005 Statut Membre Derniè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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 4 Date d'inscription vendredi 18 novembre 2005 Statut Membre Derniè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és 27 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 20 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
26 déc. 2004 à 19:44
Et cà ?
x_Filament_Ameliore<vehicule> monfil(&clio, &vehicule::avance );
cs_eracius Messages postés 2 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 26 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és 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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 ?
Rejoignez-nous