Bonjour à tous ,

je suis débutant(J'ai les bases on vas dire), et j'essai actuellement de comprendre comment marche les threads avec QT.
(Biensûr avant de poser mes questions j'ai lu et même beaucoup lu , regarder des tuto vidéos en anglais, et c'est toujours pas clair...c'est pour ça que j'ai besoin de vous)

Apparemment 3 choix dispos :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
QThread
QThreadPool
QConcurrent
Premièrement je n'ai aucun souci à créer une simple thread comme ceci avec QThread:

mainwindow.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
#include <QtCore/QThread>
#include "mythread.h"
public:
    MyThread *thread1;
mainwindow.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
thread1 = new MyThread();
thread1->start;
thread1->quit;
thread1->wait;
myThreadClass.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void run();
    QString name;
    bool Stop;
signals:
    /*mes signaux
public slots:
 
};

myThreadClass.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
 
#include <QtCore>
 
MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
 
}
 
void MyThread::run()
{
 
    QMutex mutex;
    mutex.lock();
    for(int i=0;i<11;i++)
    {
        if(this->Stop)
        {
            break;
        }
 
    }
    mutex.unlock();
 
}
Donc aucun souci pour ce bout de code tout marche parfaitement mais on est bien d'accord ...sur une seule thread ...
maintenant je fais ceci , je créé plusieurs instances de MyThread :


mainwindow.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
#include <QtCore/QThread>
#include "mythread.h"
public:
    MyThread *thread1;
    MyThread *thread2;
    MyThread *thread3;

mainwindow.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
thread1 = new MyThread(); 
thread2 = new MyThread(); 
thread3 = new MyThread(); 
thread1->start;
thread2->start;
thread3->start;
thread1->quit;
thread2->quit;
thread3->quit;
thread1->wait
thread2->wait
thread3->wait
Donc la ca marche très bien ... mais j'ai du mal a cerné complètement désolé des termes surment pas très techniques que je vais employer
mais je ne sais pas comment l'expliquer autrement : Le scop de la function run() est-il éxécuter à chaque fois par chaque thread ou chaque thread traite le même scop (donc en parallèle ce qui serait pour moi le but des threads)?
Voilà mon but tout simplement (si j'ai bien compris le principe des threads ,
alors n'hésitez surtout pas à me reprendre si ce n'est pas le cas^^)

Je cherche à faire quelque chose du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
for(int i=1;i<ui->spinBox->value();i++)
{
	thread = new MyThread();
	/*etc*/
}
je voudrai simplement, à partir d'une spinBox, pouvoir choisir le nombre de thread pour une "Tâche"(ce que j'appel tâche c'est le scop de la function run de QThread.(là je ne peux pas être plus clair)
Disons que je veux que 10 threads s'occupent d'une connexion avec QTcpSocket , comment dois-je procéder ? donc mon raisonnement est celui-ci :
Je cherche donc a créé plusieurs instances de ma classe MyThread qui s'occuperont d'une seule est même tâche...
J'ai aperçu et tester QThreadPool avec sa fonction globalInstance() (là j'ai vu le mot global et surtout instance , je me sui s tient part là dessus et j'en suis là actuellement^^) ou je définit
(surment encore de manière très sale^^) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
for(int i=1;i<ui->spinBox->value();i++)
{
    QThreadPool *pool = new QThreadPool();
    pool->globalInstance()->start(thread,0);
}
en utilisant bien evidemment QRunnable()
mais là encore ... besoin de lumière j'ai l'impression que QThreadPool sert simplement à "gérer" plusieurs threads et non à en "définir" plusieurs.


Une autre question aussi , est-il utile d'utiliser QMutex avec QRunnable() ? (j'ai rien vu qui le montrai mais vu que ca fait parti des threads je pense que oui(désolé j'en ai plein le cerveau et je commence à me mélanger)
Pour moi, les threads seraient "illimitées" en nombre pour une seule tâche(dans la limite du raisonnable).
Je possède un processeur DualCore (ne riez pas) et quand je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
qDebug() << QThread::idealThreadCount() << endl; /*return the ideal numbers of threads that can be run of this system*/
le chiffre 2 apparait ...?!.?! alors j'aimerai bien comprendre car j'ai l'impression que je pars complètement à coté
car pour moi j'ai bien deux processeurs (ça oui) qui pourront éxécutés la fonction run() mais a en lire le descriptif de la function je serais limité à 2 threads pour que ca soit idéale? (là je ne comprends vraiment pas car même voidrealms(youtube tuto 1 sur les threads) montre plusieurs instances qui exécutent la même function run()

Merci de m'éclairer car , comme on dit chez moi , je patauge dans la semoule

Ah oui aussi Qmutex protège-t-il des injections arbitraires de code malveillant (dll injection par exemple)? (car sont but et de verrouillé l'accès au thread, oui, mais à quel niveau car j'ai pas encore tout bien compris)

Des conseils? des idées ? de la doc ? (hormis celle de QT, voidrealms) , ou mieux encore des solutions ??? je suis preneur !!!

Merci à vous de prendre le temps de vous intéresser à mon cas.