C++ probleme avec un thread
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

C++ probleme avec un thread



  1. #1
    docEmmettBrown

    C++ probleme avec un thread


    ------

    Bonjour,

    voila, j'ai crée une class Network qui réceptionne les datas envoyé par mon Client et ca marche. Mais maintenant j'aimerais faire un thread, et la ca ne marche plus et je ne comprend pas pourquoi, le mieux et que je vous montre mon code :
    network.cpp :
    Code:
    #include "network.h"
    
    Network::Network(){
    	SocketTcp = new TcpServer(15000);
            thread1 = new pthread_t ;
    	pthread_create(thread1, NULL, &Network::messageRecu, NULL);
    	pthread_join(*thread1, NULL);
    }
    
    Network::~Network(){
    	delete SocketTcp;
            delete thread1;
    }
    
    void Network::messageRecu(){
    	if((int)SocketTcp->lire() == 97){
    		cout <<"message 97 recu"<<endl;
    	}else cout<<"pas 97 recu"<<endl;
    }
    et network.h :
    Code:
    #ifndef NETWORK_H
    #define NETWORK_H
    
    #include "tcpServer.h"
    #include <pthread.h>
    
    using namespace std;
    
    
    class Network{
    	public:
    		Network();
    		~Network();
    		void messageRecu();
    		TcpServer *SocketTcp = NULL;
    		pthread_t *thread1 = NULL;
    };
    
    #endif
    mon compilateur me retourne :
    network.cpp: In constructor ‘Network::Network()’:
    network.cpp:5:59: error: cannot convert ‘void (Network::*)()’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
    pthread_create(thread1, NULL, &Network::messageRecu, NULL);

    j'ai vu que la mathode Network::messageRecu() devrait etre en static pour que ca marche, c'est ca la solution ?

    merci d'avance de votre aide

    -----
    Dernière modification par docEmmettBrown ; 18/04/2017 à 21h40.

  2. #2
    pm42

    Re : C++ probleme avec un thread

    Non, cela veut dire que le prototype de ta méthode messageRecu n'est pas bon : elle doit renvoyé un void* et prendre un void* en argument.

    Il suffit de regarder l'exemple donné dans la doc de pthread_create (http://man7.org/linux/man-pages/man3..._create.3.html)
    Il faut aussi qu'elle soit statique en effet, cela ne pas être une fonction d'une classe.

  3. #3
    docEmmettBrown

    Re : C++ probleme avec un thread

    le probleme c'est que si je rend ma méthode static, alors je n'aurais pas accès à mes attributs de class, et donc je ne pourrais pas faire :
    Code:
    if((int)SocketTcp->lire() == 97)
    car SocketTcp est un attribut

  4. #4
    pm42

    Re : C++ probleme avec un thread

    Tu crées une méthode statique qui prend comme argument un void*.
    Dans ton pthread_create, tu mets comme dernier argument l'adresse de ton objet.
    Dans ta méthode statique, tu downcastes le void* en Network* et tu appelles une méthode dessus qui fait le vrai boulot...

  5. A voir en vidéo sur Futura
  6. #5
    docEmmettBrown

    Re : C++ probleme avec un thread

    0_0
    alors je précise que je suis débutant et que j'ai pas tout compris :s

    pourrais tu me donner un exemple, ca sera plus simple pour moi car j'ai jamais fait ca

  7. #6
    sandrecarpe

    Re : C++ probleme avec un thread

    En C++11, tu peux créer des threads nativement. Du coup pas de problème pour passer des méthodes en argument
    Ça donne un truc comme ça :
    Code:
    std::thread t1(&TaClasse::TaMethode, this);
    Tu peux passer d'autres arguments si besoin mais ces deux la sont le minimum pour donner une méthode en paramètre
    Dernière modification par sandrecarpe ; 18/04/2017 à 23h49.

  8. #7
    docEmmettBrown

    Re : C++ probleme avec un thread

    merci sandrecarpe pour ta réponse, mais la solution de PM42 m'interesse car programmant de temps en temps des µC, je me suis souvent retrouvé bloqué par les interruptions qui ne conservait pas les modifications des variables dans la fonction d'interruption. Je serais donc tres content de comprendre comment fonctionne la méthode de PM42 si quelqu'un sait je suis prenneur

  9. #8
    pm42

    Re : C++ probleme avec un thread

    Il y a beaucoup d'exemples de code qui font ça notamment sur stackoverflow. Une recherche avec "C++ pthread_create instance method" les trouve par ex.

  10. #9
    Jack
    Modérateur

    Re : C++ probleme avec un thread

    programmant de temps en temps des µC, je me suis souvent retrouvé bloqué par les interruptions qui ne conservait pas les modifications des variables dans la fonction d'interruption
    Il suffit de déclarer la variable comme "static" dans la fonction de traitement de l'interruption (à ne pas confondre avec un membre statique d'une classe.

  11. #10
    docEmmettBrown

    Re : C++ probleme avec un thread

    Merci pour vos réponses, le thread marche mais maintenant je n'ai plus acces à mon main.cpp :
    Code:
    #include "tcpServer.h"
    #include "network.h"
    
    int main(int argc, char const *argv[])
    {
    	Network Net;
    	cout<<"program running..."<<endl;
    
    	while(1){
    
    	}
    	return 0;
    }
    je ne vois pas la ligne program running sur mon terminal donc mon thread ne marche pas il s’exécute car je vois ce que mon client écrit mais il ne laisse plus le main se lancer
    je vous montre mon network.cpp :

    Code:
    #include "network.h"
    
    Network::Network(){
    	SocketTcp = new TcpServer(15000);
    	t1 = new thread(&Network::messageRecu, this);
    	t1->join();
    }
    
    Network::~Network(){
    	delete SocketTcp;
    	delete t1;
    }
    
    void Network::messageRecu(){
    	while(1){
    		if((int)SocketTcp->lire() == 97){
    			cout <<"message 97 recu"<<endl;
    		}else cout<<"pas 97 recu"<<endl;
    	}
    }
    ai-je fais une erreur qui expliquerait le probleme ?

  12. #11
    pm42

    Re : C++ probleme avec un thread

    Ben oui, c'est ton t1->join dans le constructeur qui attend que ton thread se finisse. Et comme il ne se finit jamais, tu ne sors pas du constructeur...

  13. #12
    docEmmettBrown

    Re : C++ probleme avec un thread

    oui, mais je l'ai déplacé dans mon main.cpp et ca ne change hélas rien, main.cpp :
    Code:
    int main(int argc, char const *argv[])
    {
    	Network Net;
    	cout<<"program running..."<<endl;
    
    	while(1){
    
    	}
    	Net.t1->join();
    
    	return 0;
    }
    mon network.cpp :
    Code:
    Network::Network(){
    	SocketTcp = new TcpServer(15000);
    	t1 = new thread(&Network::messageRecu, this);
    }
    
    Network::~Network(){
    	delete SocketTcp;
    	delete t1;
    }
    
    void Network::messageRecu(){
    	while(1){
    		if((int)SocketTcp->lire() == 97){
    			cout <<"message 97 recu"<<endl;
    		}else cout<<"pas 97 recu"<<endl;
    	}
    }

  14. #13
    pm42

    Re : C++ probleme avec un thread

    Essaie avec un debugger. Sinon, j'ai du mal à comprendre le while(1) qui ne sortira jamais dans le main mais va bouffer de la CPU.

  15. #14
    docEmmettBrown

    Re : C++ probleme avec un thread

    pour le while(1), je veux tout le temps recevoir des données d'un client, donc j'attends sans cesse un message de sa part. Je vois pas trop comment faire autrement, mais si tu as une meilleur idée je suis preneur

  16. #15
    pm42

    Re : C++ probleme avec un thread

    Dans le main ? Je répète qu'il ne sert à rien, est nuisible et que je join ensuite n'est donc jamais atteint...

Discussions similaires

  1. Multi thread c#
    Par invitedc6b9908 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 07/12/2015, 11h19
  2. probleme : mon 2eme thread ne s'active pas.
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 26/05/2015, 00h37