2

GUI プログラム内でシグナル/スロットがどのように機能するかを理解しようとしています。たとえば、メイン プログラムのスロットがシグナルを受信した場合、そのスロットを処理する別のスレッドを作成しますか?

メインウィンドウ.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void finished_result(int);

private:
    Ui::MainWindow *ui;
    QThread* thread;
    Worker* worker;

private slots:
    void run_click();
};

メインウィンドウ.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow){
    ui->setupUi(this);
}

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

void MainWindow::run_click(){
    thread = new QThread;
    Worker* worker = new Worker();
    worker->moveToThread(thread);
    connect(worker,SIGNAL(task_finished(int)),this,SLOT(finished_result(int)));
    // all other necessary signal/slot connections
    thread->start();

    // do more stuff
}

void MainWindow::finished_result(int x){
    // do some stuff
}

このようなプログラムでは、"do more stuff" の処理に時間がかかり、ワーカーrun_click()が戻る前に作業を終了するとします。そのため、 が発行されたrun_click()ときにまだ実行task_finished(int)されます。finished_result(int)すぐに開始しますか、それとも終了するのを待ちますrun_click()か? finished_result(int)同じスレッドで開始しますrun_click()か、それとも新しいスレッドで開始しますか?

私の特定の問題は、QWaitConditionそのスレッドをしばらく保持する「より多くのことを行う」に関係のないものがあることです。finished_result(int)終わるのを待たずに先に進みたいrun_click()。続行する方法はありますか?「より多くのことを行う」を新しいスレッドの別のワーカーに移動する必要がありますか?

4

2 に答える 2

3

いいえ、シグナルが新しいスレッドを作成することはありません。

あなたの場合、同じスレッドでこの順序で実行されますrun_click()finished_result(int x)シグナルtask_finished(int)がワーカー スレッドから送信されると、シグナルは転送されてメイン スレッドのキューで待機しrun_click()、終了を待ってからイベント ループに戻ります。その時だけfinished_result(int x)呼び出されます。

これは「キュー接続」と呼ばれ、異なるスレッド間でシグナルとスロットを使用する場合のデフォルトの動作です。詳細については、ドキュメントのThreads と QObjectsを参照してください。特に、セクションSignals and Slots Across Threads を参照してください。

于 2013-08-29T05:28:14.327 に答える