Bonjour tout le monde,

Tout d'abbord excusez moi pour ce thread un peu long... J'ai cependant fait de mon mieux pour le rendre plus lisible

J'espère que la rentrée se passe bien pour vous. Trouvant le programme CE1 un peu léger, j'ai décidé de m’intéresser à la programmation multithread.

J'ai crée un petit projet pour vérifier ce que j'ai compris de la lecture de la documentation et évidemment, il y a un truc que j'ai compris de travers. J'ai une erreur lors de l'utilisation d'un mutex (un qmutexlocker s'il vous plait!). Voici le message d'erreur :

Exception levée*: violation d'accès en lecture.

d a été 0xFFFFFFFFFFFFFFFF.

S'il existe un gestionnaire pour cette exception, le programme peut continuer en toute sécurité.

Je vous envoie le code source de mon projet : voici le diagramme. En gros, je possède une classe assez bas niveau (classedebase), que je dérive pour créer une classe fille (qui dérive aussi de Qobject pour pouvoir utiliser les signaux/slots). Je crée une classe Controleur (laquelle va servir à contrôler les process multiithread) et une classe interface (on peut imaginer plus tard que ce sera elle qui gérera l'IU)

Nom : Mutex.PNG
Affichages : 90
Taille : 22,9 Ko

Et le code source :

La classe de base :

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
 
#include "ClasseDeBase.h"
 
int ClasseDeBase::FonctionLongue(void)
{
	for (int i = 1; i < 10000000; i++)
	{
		i = i;
	}	
	cout << "Sortie fonction longue" << endl;
	return 0;
}
 
ClasseDeBase::ClasseDeBase(){}
ClasseDeBase::~ClasseDeBase(){}

La classe fille,
que je dérive non seulement de la classe de base mais aussi de qObject pour pouvoir utiliser les signaux et slots etc etc...


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
 
void ClasseFille::DoWork()
{
	QMutexLocker QMutexLocker(&mutex);// si j'enlève cette ligne tout fonctionne bien
	FonctionLongue();
	emit ResultIsReady();
}
 
void ClasseFille::Affiche(void)
{
	cout << "Resultat Fini : je suis dans le slot affiche" << endl;
}
 
ClasseFille::ClasseFille(){}
ClasseFille::~ClasseFille(){}
Voici le code du contrôleur Multithread


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
 
Controleur::Controleur(ClasseFille * Travailleur)
{
	TheWorkingThread = new QThread;
 
	cout << "Entree dans la fonction Controleur" << endl;
	Travailleur->moveToThread(TheWorkingThread);
 
	connect(TheWorkingThread, SIGNAL(started()), Travailleur, SLOT(DoWork()));
	connect(Travailleur, SIGNAL(ResultIsReady()), Travailleur, SLOT(Affiche()));	
	connect(Travailleur, SIGNAL(ResultIsReady()), TheWorkingThread, SLOT(quit()));
	connect(Travailleur, SIGNAL(ResultIsReady()), Travailleur, SLOT(deleteLater()));
	connect(Travailleur, SIGNAL(ResultIsReady()), TheWorkingThread, SLOT(deleteLater()));
 
	TheWorkingThread->start();
 
}
 
 
Controleur::~Controleur()
{
	cout << "destructeur controleur" << endl;
}

Et enfin la classe interface, qui gère la relation entre le contrôleur et ma classe fille :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
void ClasseInterface::test(ClasseFille *b)
{
 
	ClasseFille *a = new ClasseFille;
	a = b;
	Controleur zControleur(a);
}
 
ClasseInterface::ClasseInterface(){}
ClasseInterface::~ClasseInterface(){}
Et enfin le main :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	ClasseInterface b;
	ClasseFille *LaClasse= new ClasseFille;
	b.test(LaClasse);
	return a.exec();
}
En plus du problème technique, j'aimerais surtout avoir votre avis sur l'architecture de ce mini projet. Je dois utiliser le multithread dans le cadre d'un autre projet (comme vous pouvez l'imaginer un peu plus complexe), le problème est que j'ai très peu de retour d’expérience là où je travaille. J'aimerais vraiment profiter sur vos connaissances sur le sujet et avoir vos remarques sur cette architecture. L'idée finale étant d'utiliser le constructeur contrôleur avec différentes classes en fonction de ce que je veux faire.

Vous en pensez quoi?


Pour info la sortie console :

Entree dans la fonction Controleur
destructeur controleur
Sortie fonction longue
Resultat Fini : je suis dans le slot affiche
QThread: Destroyed while thread is still running
QMutex: destroying locked mutex

Merci d'avance pour vos retours!