oleja1ee7
@oleja1ee7

Как правильно отправить в поток функцию?

Здравствуйте.

есть простая функция для примера:
spoiler
void MainW::foo(){
    if(ui->progressBar->value()<50){
        ui->progressBar->setValue(79);
    }
    else{
        ui->progressBar->setValue(23);
    }
}

Так же попытка положить её в другой поток:

spoiler
void MainW::on_output_excel_butt_clicked()
{
    QThread trd;
    moveToThread(&trd);
    connect(&trd, SIGNAL(started()), this, SLOT(foo()));
    trd.start();
}

Приложение просто закрывается при нажатии на кнопку, без ошибок. в чем может быть проблема?
  • Вопрос задан
  • 1318 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Чисто на всякий случай, оставлю этот код тут. Как я понимаю, это то, что вы хотите получить: функция в отдельном потоке, без блокировки GUI + вам нужно дождаться результатов выполнения.
QEventLoop loop;
QFutureWatcher watcher = QConcurrent::run(someFunc);
connect(&watcher, &QFutureWatcher::finished,  &loop, &QEventLoop::quit);
loop.exec();
auto result = watcher.result();

Если результат выполнения не нужен, то функцию можно просто асинхронно запустить одним методом run.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
ЕМНИП в Qt с гуями можно работать только в основном потоке. Т.е. какие-то "тяжелые" или блокирующиеся чем-либо действия нужно делать в отдельном потоке, а потом через сигналы дергать функции в основном потоке, чтобы они меняли состояние гуев.
Ответ написан
Комментировать
Попробуйте такой вариант
connect(&trd, SIGNAL(started()), this, SLOT(foo()), Qt::QueuedConnection);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы