【问题标题】:Wait until all threads are finished in main thread using Qt/C++等到所有线程在使用 Qt/C++ 的主线程中完成
【发布时间】:2015-01-12 06:48:26
【问题描述】:

我想在代码中设置一个条件,等待所有线程在主线程最终槽中完成,以下是测试代码..

testClass::testClass()
{
    m_count = 0;
    m_flag = false;
    for( int i = 0; i < 3; i++)
    {
        QThread *thread = new QThread();
        WorkerThread *worker = new WorkerThread();

        connect(thread, SIGNAL(started()), worker, SLOT(startThread()));
        connect(worker, SIGNAL(workerFinished()), this, SLOT(threadFinished()));
        connect(worker, SIGNAL(workerFinished()), thread, SLOT(quit()));
        connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater()));
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
        m_workerList.append(worker);
     }
}

void testClass::threadFinished()
{
    // wait untill all thread are finished, how to achive this ?
    if(!m_flag)
    {
        // print << m_flag;
        m_flag = true;
    }
}

void WorkerThread::startThread()
{
    emit workerFinished();
}

这里 testClass 在主线程中,我希望应用程序在 threadFinished 插槽中等待,直到我在 testClass 构造函数中启动的所有线程完成,有人可以建议最好的方法吗?

我在 Windows 7 中使用 Qt 5.4.0。

【问题讨论】:

  • 你不能在所有线程上都 wait() 吗?

标签: c++ multithreading qt qthread qt5.4


【解决方案1】:

如果除了 Qt 之外还使用 boost 是一个选项,您可以使用一个线程组并调用 join_all,它会一直等待直到组中的所有线程都完成。

此外,QThreadPool 提供了 waitForDone() 函数(“等待每个线程退出并从线程池中删除所有线程。”),但是您可能需要稍微重构您的工作对象以符合 QRunnable 接口。

更基本的解决方案是为每个线程设置一个带有一个条目的 QVector 或 QMap 成员变量,并在相应线程完成时将它们设置为 true。仅当所有线程在您的成员变量中都达到“finished = true”状态时,才能在您的插槽中继续执行程序。

【讨论】:

  • 我实现了第三个解决方案,它可以工作,无论如何我也想尝试第二个,以便更好地理解 qt 类。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2019-10-24
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多