Bonjour,
Toujours dans le cadre de mon projet BTS (qui avance bien d'ailleurs au passage ), je dois faire une application multi tâches.
Grosso modo, cette application doit recevoir des données de deux clients en même temps. Pour cela, j'utilise les threads.
Après moult recherches, je parviens à les utiliser en C++ normal (non orienté objet) mais ce n'est pas mon but (je dois utiliser la POO pour mon projet).
Suite à ce succès, j'ai créé une classe Processus contenant une méthode publique chargée de créer un thread à partir d'une autre méthode publique.
Header :
Méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #pragma once #include <pthread.h> #include <iostream> #include <string> using namespace std; class Processus { int nbThreads; pthread_t thread1; private: int recevoir(); public: Processus(void); ~Processus(void); void demarrerThread(); void arreterThread(); void* fonctionThread(); int getThread(); };
Fichier main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include "StdAfx.h" #include "Processus.h" /* Constructeur et destructeur */ void Processus::demarrerThread() { cout<<"Demarrage des threads"<<endl; int th1 = 0, j1 = 0; // val à 0 pour test if(nbThreads < 2) { void* (*pVoid)(void *); pVoid = (void *(*)(void *)) fonctionThread(); th1 = pthread_create(&thread1, NULL, pVoid, NULL); if(th1 == 0) // th1 -> premier thread a créer { //j1 = pthread_join(thread1, NULL); // si j'appelle cette fonction, le programme plante totalement (a cessé de fonctionner) if(j1 == 0) { cout<<"Reception donnees du serveur normal en cours"<<endl; } nbThreads++; } } } void Processus::arreterThread() { int c1 = 0; c1 = pthread_cancel(thread1); if(c1 == 0) { cout<<"Thread arreter"<<endl; } } void* Processus::fonctionThread() { cout<<"fonctionThread"<<endl; return NULL; }
Dès que j'appelle la méthode demarrerThread, ça plante et j'ai ce message dans la fenêtre de l'application :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include "stdafx.h" #include "Processus.h" int _tmain(int argc, _TCHAR* argv[]) { Processus process; cout<<"Les threads"<<endl; process.demarrerThread(); return 0; }
J'ai également un autre cas de figure. Si j'appelle pthread_join dans la méthode demarrerThread(), le programme se fige et m'indique qu'il a cessé de fonctionner.
J'ai également essayé de threadé une méthode publique à partir du main mais ça plante également.
Je développe sous Visual Studio 2010 sous Windows Seven.
Que faire pour résoudre le problème et pour pouvoir threader deux méthodes (soit la même qui sera threadé 2 fois soit deux différentes) ?
Merci de votre aide.
Partager