LINUX.ORG.RU

Как правильно запускать фигню в отдельном потоке

 , ,


1

3

Всем привет. Я давным-давно написал одно приложение на C# с виндуз формами, недавно захотел переписать под C++ и гтк.

Единственное, с чем начались проблемы так это нормальное отделение логики от UI-потока.

С C# все очень просто, запускаешь парсинг и скачку в отдельном потоке, ничто не лагает, счетчик обновляется.

Юзаю самый простой пример работы с потоками, просто по нажатию на кнопку создаю поток из функции и запускаю его и нифига! Залагало на пару секунд и пишет, что все готово!

Какого чёрта?

Вот, как я запускаю поток.

    void dlButtonCallback() {
      std::thread thrd(std::bind(downloading));
      thrd.join();
    }


Последнее исправление: Kotank (всего исправлений: 2)

Какого чёрта?

join() ожидает завершение потока.

Тебе нужно вызывать join() для этого потока где-то в другом месте, а не сразу же после его создания.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Ты запускаешь поток, чтобы не вешать UI, и тут же в обработчике события UI садишься его ждать. Витаминов попить, может?

Makhno
()

Что попросил, то и получил.

peregrine ★★★★★
()

Если ты поток хочешь убить сразу по выполнении, то юзай std:async

eagleivg ★★★★★
()

переписать под C++ и гтк.

Какого чёрта?

Симметрично.

П.С. https://doc.qt.io/

anonymous
()

Дай угадаю, ты в C# использовал async/await? Здесь этого в том же виде нет, и делается это не так. А ты запустил поток и стал ждать его завершения, что аналогично

void dlButtonCallback() {
    std::bind(downloading)();
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.