@katavagner

Почему зависает GUI в Qt?

Есть основной класс, в котором прописаны все элементы. В конструкторе пишу чтобы метод thread_import работал в другом потоке:
OneThing::OneThing(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::OneThing)
{
     // какой-то код
    qDebug() << "MAIN THREAD: " << QThread::currentThread();
    QFuture<bool> future = QtConcurrent::run(this, &OneThing::thread_import);
    QFutureWatcher<bool> watcher;
    watcher.setFuture(future);
}

Метод thread_import выглядит следующим образом:

bool OneThing::thread_import() {
    qDebug() << "IMPORT THREAD: " << QThread::currentThread();

    connect(ui->button_import, &QPushButton::clicked, this, [this]() {
                int count = 0;
        qDebug() << "CONNECT THREAD: " << QThread::currentThread();
                while (true) {
                    qDebug() << "THREAD: " << count;
                    count++;
                    QThread::sleep(1);
                }
    });

    return true;
}


Вывод:
MAIN THREAD:  QThread(0x1fd1f88)
IMPORT THREAD:  QThread(0x41bfbe8, name = "Thread (pooled)")
CONNECT THREAD:  QThread(0x1fd1f88)


То есть поток новый создается и, если поместить бесконечный цикл в метод thread_import, а не в слот функции connect, то GUI не зависнет, так как вычисления выполняются в другом потоке.

Не могу понять, как сделать, чтобы по нажатию на кнопку, слот выполнялся в новом потоке.
  • Вопрос задан
  • 476 просмотров
Решения вопроса 1
@redcircle
Переместите QtConcurrent::run внутрь лямбды [this]() {}, а connect вызывайте в основном потоке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы