LINUX.ORG.RU

std::thread vs QThread

 ,


1

2

Собсно, если Qt используется уже, для случая когда нужен постоянно живущий тред. Каковы доводы в пользу первого и второго?

★★★★★

QThread умеет в сигналы и слоты без велосипедов.

aiqu6Ait ★★★★
()

Qt тред это не тоже самое, что std::thread. Читай про правильное использование оного. Для Qt приложух лучше Qt, очевидно.

anonymous
()
Ответ на: комментарий от CrossFire

В Qt5 stdlib используется по умолчанию. Мало того, в некоторых местах использование вещей из std вместо Qt даже поощряется.

UVV ★★★★★
() автор топика

Очевидно QThread. Хотя бы потому что удобно.

matrixd
()
Ответ на: комментарий от UVV

В Qt5 stdlib используется по умолчанию. Мало того, в некоторых местах использование вещей из std вместо Qt даже поощряется.

Ткни в исходники позязя. Интересно же.

matrixd
()
Ответ на: комментарий от matrixd

позязя

?

Интересно же.

http://doc.qt.io/qt-5/qtalgorithms.html

Historically, Qt used to provide functions which were direct equivalents of many STL algorithmic functions. Starting with Qt 5.0, you are instead encouraged to use directly the implementations available in the STL; most of the Qt ones have been deprecated (although they are still available to keep the old code compiling).

UVV ★★★★★
() автор топика

Qt потоки идеальны для сувания в них QObject, и обмен по сигналам-слотам, очень приятная многопоточность получается :)

А вот если блокирующий код, то может быть уже тогда можно и std::thread...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от invy

Я таки возьму QThread.. сигнал-слоты довольно удобные получаются и если следовать http://doc.qt.io/qt-5/threads-technologies.html и сделать QObject worker, то получается как бы отделение логики треда в отдельный класс.

Т.е. у меня получится почти так же, как и ты тут Создание фонового треда на время жизни класса (комментарий) посоветовал, только вычисления уйдёт в другой класс, а не в функцию.

UVV ★★★★★
() автор топика
Ответ на: комментарий от invy

Там речь про

algorithmic functions

Ну и плюс QThread умеет больше (в связи с Qt), чем обычный std::thread, поэтому первый никак не могли задепрекейтить.

intelfx ★★★★★
()

я просто оставлю это здесь:

     auto po = new ProcessingObject();
     connect(po, ...);
     po->moveToThread(nullptr); // enable "pulling" moveToThread()
     auto t = std::thread([po, gui = QThread::currentThread()]() {
         QEventLoop loop;
         po->moveToThread(QThread::currentThread());
         connect(po, ..., &loop, &QEventLoop::quit);
         loop.exec();
         po->moveToThread(gui);
         // or: delete po;
     }

http://lists.qt-project.org/pipermail/development/2016-January/024502.html

anonymous
()
Ответ на: комментарий от anonymous

Покажи, как ты задействуешь в асинхронном программировании и одном потоке 16 ядер. Или хотя бы 2.

Chaser_Andrey ★★★★★
()
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от anonymous

открою тебе секрет: никакого асинхронного выполнения на софтовом уровне нет. настоящая асинхронная работа - это прерывания от железа. и на этом, собственно, всё. остальное - надстройки над тредами в кернеле или в библиотеках.

Iron_Bug ★★★★★
()
11 августа 2016 г.
Ответ на: комментарий от Iron_Bug

настоящая асинхронная работа - это прерывания от железа

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

anonymous
()

в пользу второго - есть сигналы. я на них запилил opengl рендерер в паралельном потоке где ему приходят указатели на класс, который хочет порисовать, там вызывается paint, ставится GLsync, и как только sync отстрелялся, сигналом сообщают что класс «готов».

с std::thread надо самому колхозить передачу данных в поток и обратно. а это муторно. тем более что qt уже используется.

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