QThread всегда ждал

Я пытаюсь использовать для вызова функции в другом потоке без зависания пользовательского интерфейса. Я использую QT5.11.2 как в Windows, так и в Linux .

В окнах все работает нормально, но функция wait () для QThread никогда не возвращается ни на что.

Я использую RHEL7 на linux

Вот что я делаю:

      void MainWidget::configure_click(double value)
{
    QThread *myThread = QThread::create([this, value]{ Configure(value); });
    dsoThread->setObjectName("My Configure Thread");
    QObject::connect(myThread, &QThread::finished, [](){ qDebug()<< "Configure Thread has finished";});  //  This is never printed

    myThread->start();
    myThread->wait();  //  Never returns from this
    myThread->quit();
    myThread->deleteLater();
}

Мой Configure функция печатает его начало и конец, и обе строки печатаются во время выполнения

      void MainWidget::Configure(double value)
{
    qDebug() << QThread::currentThread() << " started";
    
    //  Code to execute

    qDebug() << QThread::currentThread() << " finished";
}

Я даже читал, что это заставляет поток останавливаться, поэтому просто для тестирования я попытался переключить quit() и вот так

          myThread->quit();
    myThread->wait();  //  Never returns from this either
    myThread->deleteLater();

Я даже пытался зациклить isRunning() функция вместо wait() но я получил те же результаты

          while(myThread->isRunning())  //  Same goes for !isFinished()
    {
        //  Do nothing
    }

Кажется, что независимо от того, что поток никогда не знает, что он был закончен.

Что я могу сделать, чтобы решить эту проблему или проверить, почему это происходит?

1 ответ

  1. У тебя нет start()редактировал нить.
  2. myThread->wait(); в потоке графического интерфейса ожидает завершения потока, поэтому он блокирует цикл событий потока графического интерфейса, поэтому вы теряете все преимущества потоковой передачи таким образом и можете просто сделать Configure(value); без заправки.

В документации говорится:

Функции wait () и sleep () вообще не нужны, поскольку Qt - это среда, управляемая событиями. Вместо wait () рассмотрите возможность прослушивания сигнала finished (). Вместо функций sleep () рассмотрите возможность использования QTimer.

Другие вопросы по тегам