2016-09-08 10 views
0

2つのスレッドを接続したい。 1つのスレッドは私のアプリケーションのメインスレッドで、もう1つはワーカースレッドです。私はコードdoc.qt.io/qt-5/の次の例に基づいています。私にとっては完全には機能しません。私はQStringをWorkerThread(この作品)に送っていて、後でMainThreadに送り返したい(うまくいかない)。なぜ私がこれをやっているのかを尋ねる前に、それは単なる非常に簡単な例です。実際のコードははるかに複雑ですが、まったく同じ問題があります。これらの例を実行すると、複雑なものもうまくいくと私は確信しています。ここでは、コード:Qt:マルチスレッド接続が機能しない

MAIN.CPP

#include "Controller_C.h" 
#include <QtWidgets/QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Controller_C Controller; 
    Controller.SendData("Hello World!"); 
    return a.exec(); 
} 

Controller_C.cpp

#include "Controller_C.h" 
#include <qmessagebox.h> 

Controller_C::Controller_C(QWidget *parent) 
    : QMainWindow(parent), 
     Worker(new Worker_C()) 
{ 
    ui.setupUi(this); 

    Worker->moveToThread(&WorkerThread); 
    connect(&WorkerThread, SIGNAL(started()), this, SLOT(ThreadStarted())); 
    connect(this, SIGNAL(SendToWorker(QString)), Worker, SLOT(DoWork(QString))); 
    connect(Worker, SIGNAL(SendToController()), this, SLOT(ReceiveData())); 
    WorkerThread.start(); 
} 

Controller_C::~Controller_C() 
{ 

} 

void Controller_C::SendData(QString aString) 
{ 
    QThread* Controller = QThread::currentThread(); 
    QMessageBox::information(this, "Info", QString("We have send the following to the Worker Thread: %1").arg(aString)); 
    emit SendToWorker(aString); 
} 

void Controller_C::ReceiveData(QString aString) 
{ 
    QThread* Controller = QThread::currentThread(); 
    QMessageBox::information(this, "Info", QString("The Controller received the following: %1").arg(aString)); 
} 

Controller_C.h

#ifndef CONTROLLER_C_H 
#define CONTROLLER_C_H 

#include <QtWidgets/QMainWindow> 
#include "ui_Controller_C.h" 
#include "Worker_C.h" 
#include <qthread.h> 

class Controller_C : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    Controller_C(QWidget *parent = 0); 
    ~Controller_C(); 

    void SendData(QString aString); 

private: 
    Ui::Qt_TestEnvironmentClass  ui; 
    Worker_C*      Worker; 
    QThread       WorkerThread; 

signals: 

    void SendToWorker(QString); 

public slots: 

    void ReceiveData(QString aString); 
}; 

#endif // CONTROLLER_C_H 

Worker_C.cpp

#include "Worker_C.h" 
#include <qmessagebox.h> 
#include <qthread.h> 

Worker_C::Worker_C() 
{ 

} 

Worker_C::~Worker_C() 
{ 

} 

void Worker_C::DoWork(QString aString) 
{ 
    QThread* Worker = QThread::currentThread(); 
    emit SendToController(aString); 
} 

Worker_C.h

#ifndef WORKER_C_H 
#define WORKER_C_H 

#include <QObject> 

class Worker_C : public QObject 
{ 
    Q_OBJECT 

public: 
    Worker_C(); 
    ~Worker_C(); 

public slots: 

    void DoWork(QString aString); 

signals: 

    void SendToController(QString); 

}; 

#endif // WORKER_C_H 

ご協力いただきありがとうございます。

+1

を、' QString'引数が、私は「 –

答えて

0

あなたは、ヘッダー内のスロット/信号をdefinied方法のように:

無効ReceiveData(QStringのaStringの);
void SendToController(QString);

また、あなたの接続には、このようにそれらを使用する必要があります。労働者信号のためのあなたの `connect`コールで

connect(Worker, SIGNAL(SendToController(QString)), this, SLOT(ReceiveData(QString)));` 


+0

が欠落しています多くのシグナルを出す場合は、より複雑なコードでQApplication :: processEvents()を使用することをお勧めします。それは悪いアドバイスです。コードが既に壊れている場合にのみ意味があります。 'processEvents'が必要だと思うなら、あなたは何か間違っています。 –

+0

(GUIを更新するために)実際に保留中のイベントを持つ長期実行プロセスを持ついくつかのUIアプリケーションでは、 'processEvents'が必要です。私は 'processEvents'にはいくつかのアプリケーションがあると思いますが、' processEvents'を呼び出すことは最初のオプションではないはずです。それを私の殻から取り除きます。 – Drayke

+0

GUIスレッドに長時間実行されるプロセスはありません。存在すれば、すでに壊れている。 –

関連する問題