0

mainwindow.cpp:

#include "ui_mainwindow.h"
#include <QtCore>

/* ****** Thread part ****** */
myThread::myThread(QObject *parent)
    : QThread(parent)
{
}

void myThread::run()
{
    while(1){
        qDebug("thread one----------");
        emit threadSignal1();
        usleep(100000);
    }
    exec();
}

myThread2::myThread2(QObject *parent)
    : QThread(parent)
{
}

void myThread2::run()
{
    while(1){
        qDebug("thread two");
        emit threadSignal2();
        usleep(100000);
    }
    exec();
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    onethread = new myThread(this);
    onethread->start(QThread::NormalPriority);

    twothread = new myThread2(this);
    twothread->start(QThread::NormalPriority);

    connect(onethread, SIGNAL(onethread->threadSignal1()),
            this, SLOT(mySlot1()));
    connect(twothread, SIGNAL(threadSignal2()),
            this, SLOT(mySlot2()),Qt::QueuedConnection);
}

void MainWindow::mySlot1()
{
    ui->textEdit1->append("This is thread1");
}

void MainWindow::mySlot2()
{
    ui->textEdit1->append("This is thread2");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->textEdit1->append("textEdit1");
    ui->textEdit2->append("textEdit2");
}

mainwindow.h:

#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>

namespace Ui {
class MainWindow;
}

class myThread : public QThread
{
  Q_OBJECT

public:
    myThread(QObject *parent = 0);
    void run();

signals:
    void threadSignal1();
};

class myThread2 : public QThread
{
  Q_OBJECT

public:
    myThread2(QObject *parent = 0);
    void run();

signals:
    void threadSignal2();
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void mySlot1();
    void mySlot2();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    myThread *onethread;
    myThread2 *twothread;
};

#endif // MAINWINDOW_H

上記のコードを確認してください。qDebugtextEdit1 / 2には出力がありませんが、通常どおり出力を提供できます。そして、それはマルチスレッド信号/スロット接続の問題のようです。誰が助けることができますか?ありがとう!

4

1 に答える 1

1

スロットをスロットとして定義する必要があります。

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void mySlot1();
    void mySlot2();
...

他にもいくつかあります。exec()各スレッドで呼び出す必要はありません。彼らはとにかく無限ループに入り、そのステートメントに到達することは決してありません。また、その目的はexec()、スレッドでイベントループを開始して、独自のスロットを持つように、イベントを受信して​​処理できるようにすることです。あなたはただ放出しているだけです。

この接続が機能しますか?

connect(onethread, SIGNAL(onethread->threadSignal1()),
        this, SLOT(mySlot1()));

おそらく次のようになります。

connect(onethread, SIGNAL(threadSignal1()),
        this, SLOT(mySlot1()));

QueuedConnection接続は、エミッターとは異なるスレッドの所有者のスロットをターゲットにしているため、接続が暗示されると思います。

于 2012-12-22T05:44:27.127 に答える