UIのスレッド内でマルチスレッド更新を実装する方法

Qt では、シグナルとスロットの仕組みを使って、マルチスレッドで UI を更新できます

  1. QObjectを継承したクラスを作成し、マルチスレッドのワーカースレッドとして使用します。このクラスでは、バックグラウンドで実行する必要がある操作を定義できます。
class WorkerThread : public QObject
{
    Q_OBJECT

public:
    WorkerThread();

public slots:
    void doWork();

signals:
    void workFinished();
};
  1. ワーカースレッドクラスのdoWork()関数内でバックグラウンド処理のロジックを記述する。
void WorkerThread::doWork()
{
    // 在这里编写后台操作的逻辑

    // 发送工作完成的信号
    emit workFinished();
}
  1. メインスレッドでワーカースレッドのオブジェクトを作成し、ワーカースレッドのworkFinished()シグナルをメインスレッドのスロット関数へ接続します。
WorkerThread workerThread;
QThread thread;

// 将工作线程对象移动到子线程中
workerThread.moveToThread(&thread);

// 连接工作线程的workFinished()信号到主线程的槽函数
QObject::connect(&workerThread, SIGNAL(workFinished()), &app, SLOT(onWorkFinished()));

// 启动子线程
thread.start();

// 在主线程中调用工作线程的doWork()函数
QMetaObject::invokeMethod(&workerThread, "doWork");
  1. メインスレッドから、画面更新用のスロット関数を発行する。
class MyApplication : public QApplication
{
    Q_OBJECT

public slots:
    void onWorkFinished();
};

void MyApplication::onWorkFinished()
{
    // 在这里更新界面

    // 停止子线程的事件循环
    qApp->thread()->quit();
}
  1. MyApplicationオブジェクトをメイン関数内で作成し、Qtアプリケーションのイベントループを開始します。
int main(int argc, char *argv[])
{
    MyApplication app(argc, argv);

    // 在这里创建界面窗口并显示

    // 启动Qt应用程序事件循环
    return app.exec();
}

上記の手順を行えば、マルチスレッドの中でUIを更新することができます。ワーカースレッドではシグナルとスロットの仕組みを使ってメインスレッドと通信を行い、処理が完了したらシグナルをメインスレッドへ送信し、スロット関数をトリガーしてUIを更新します。

bannerAds