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()
。続行する方法はありますか?「より多くのことを行う」を新しいスレッドの別のワーカーに移動する必要がありますか?