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 ответ
- У тебя нет
start()
редактировал нить. -
myThread->wait();
в потоке графического интерфейса ожидает завершения потока, поэтому он блокирует цикл событий потока графического интерфейса, поэтому вы теряете все преимущества потоковой передачи таким образом и можете просто сделатьConfigure(value);
без заправки.
В документации говорится:
Функции wait () и sleep () вообще не нужны, поскольку Qt - это среда, управляемая событиями. Вместо wait () рассмотрите возможность прослушивания сигнала finished (). Вместо функций sleep () рассмотрите возможность использования QTimer.