J'utilise Qt5 où j'implémente un thread en passant le worker QObject à une instance de QThread par moveToThread(). Ma mise en œuvre ressemble à ceci ..Qt: Signal/Slot ne fonctionnant pas après que QObject ait été déplacé vers un thread différent
Worker.h
class worker : public QObject
{
Q_OBJECT
public:
explicit worker(QObject *parent = 0);
bool IsWorkRunning();
void MoveObjectToThread();
signal:
void SignalToObj_mainThreadGUI();
public slots:
void do_Work();
void StopWork();
void StartWork();
private:
void Sleep();
QThread *workerthread;
volatile bool running,stopped;
};
Worker.cpp
worker::worker(QObject *parent) :
QObject(parent),stopped(false),running(false)
{
}
void worker::do_Work()
{
running = true;
while(!stopped)
{
if(running)
{
emit SignalToObj_mainThreadGUI();
workerthread->msleep(20);
}
}
}
void worker::StopWork()
{
running = false;
}
void worker::StartWork()
{
running = true;
}
bool worker::IsWorkRunning()
{
return running;
}
void MoveObjectToThread()
{
workerthread = new QThread;
QObject::connect(workerthread,SIGNAL(started()),this,SLOT(do_Work()));
this->moveToThread(workerthread);
workerthread->start();
}
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void Startwork_mainwindow();
void Stopwork_mainwindow();
public slots:
private slots:
void on_pushButton_push_to_start_clicked();
void on_pushButton_push_to_stop_clicked();
private:
Ui::MainWindow *ui;
worker myWorker;
bool work_started;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),work_started(false),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QObject::connect(this,SIGNAL(Startwork_mainwindow()),&myWorker,SLOT(StartWork()));
QObject::connect(this,SIGNAL(Stopwork_mainwindow()),&myWorker,SLOT(StopWork()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_push_to_start_clicked()
{
if(!work_started)
{
myWorker.MoveObjectToThread();
work_started = true;
}
if(!myWorker.IsWorkRunning())
emit this->Startwork_mainwindow();
}
void MainWindow::on_pushButton_push_to_stop_clicked()
{
if(myWorker.IsWorkRunning())
emit this->Stopwork_mainwindow();
}
ne sais pas pourquoi les deux paires signal/emplacement suivant ne marche pas semble fonctionner
QObject::connect(this,SIGNAL(Startwork_mainwindow()),&myWorker,SLOT(StartWork()));
QObject::connect(this,SIGNAL(Stopwork_mainwindow()),&myWorker,SLOT(StopWork()));
En conséquence, je ne peux pas démarrer ou arrêter le fil une fois que la fente do_Work()
est déclenchée par started()
le signal de l'objet QThread. Juste pour référence ce poste de la mine est une continuation de mon précédent post here described aperçu .Tout sera utile ... Merci
Avez-vous essayé de passer au fil avant d'effectuer l'une des connexions de signal? Comme juste après l'avoir fait? Votre boucle externe ne tourne-t-elle pas aussi follement dans votre thread quand elle ne tourne pas? Peut-être qu'il a besoin d'un sommeil aussi bien pour aider le planificateur. – jdi
Au lieu d'utiliser 'moveToThread', je réimplémenter' QThread'. C'est plus facile à suivre, et je pense que c'est moins sujette aux erreurs. Et lorsque vous utilisez 'QObject :: connect' du thread principal vers un autre thread, ne vous connectez pas à un autre thread en utilisant' AutoConnect', utilisez ['QueuedConnection'] (http://qt-project.org/doc/qt- 4.8/qt.html # ConnectionType-enum) à la place. – phyatt
et si j'utilise Qt :: Directconnection? et certains où dans les forums je lis le sous-classement QThread n'est pas une bonne pratique ... et Qt5 a rendu public beaucoup de fonctions privées statiques en raison de ce paradigme d'utilisation –