Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: vebmaster от Февраль 10, 2017, 19:44



Название: QRunnable. Сигнал доходит после завершения потока.
Отправлено: vebmaster от Февраль 10, 2017, 19:44
Приветствую.
имеется пул
Код:
    threadPool = new QThreadPool;
    threadPool->setMaxThreadCount(50); // кол-во ПОТОКОВ
    threadPool->setExpiryTimeout(100);
помещаю объект в пул
Код:
    Work *worker = new Work();
    worker->setAutoDelete(true); // true - поток уничтожается сразу же после завершения работы Work
    connect(worker, SIGNAL(goodSignal()), this, SLOT(mySlot()));
    threadPool->start(worker);

после доабавления заданий в очередь пула жду завершения
Код:
threadPool->waitForDone(-1);
но сигналы доходят после завершения потоков. Почему так?


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: Пантер от Февраль 13, 2017, 09:26
Не совсем понял проблему, но мне кажется, что все дело в Qt::QueuedConnection при соединение, в итоде ты сигналы и получаешь не сразу после waitForDone.


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: vebmaster от Февраль 13, 2017, 22:24
вот я добавил допустим 10 заданий в пул (пул на 50 потоков)
Код:
threadPool->start(worker);
в worker выполняется работа, которая может занимать разное время, и отправляется сигнал в родительский объект. И у меня получается так, что все 10 сигналов дойдут до слота после завершения всех 10 заданий в одну и туже секунду, а не когда он был отправлен.
Т.е. если первый поток справился за 1 секунду и отправил сигнал, а 10й поток завершился за 30 секунд, то сигнал от 1-го потока всё равно прийдёт когда завершится 10й. (прийдут все 10 сигналов за раз)


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: Пантер от Февраль 13, 2017, 22:57
waitForDone убери


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: Igors от Февраль 14, 2017, 12:07
Некому ловить сигнал, пул просто вызывает QRunnable::run (а не ждет в цикле событий нитки)


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: vebmaster от Февраль 14, 2017, 19:41
waitForDone убери
тоже самое

Некому ловить сигнал, пул просто вызывает QRunnable::run (а не ждет в цикле событий нитки)
т.е. задействовать сигналы не получится чтоль?


Название: Re: QRunnable. Сигнал доходит после завершения потокk
Отправлено: vebmaster от Февраль 20, 2017, 20:14
разобрался, спасибо, у куРуннабле отсутствует цикл обработки событий и сигналы во вне он отправлять не может.
подробнее здесь  (https://wiki.qt.io/Threads_Events_QObjects/ru#.D0.A1.D1.80.D0.B0.D0.B2.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B2.D0.BE.D0.B7.D0.BC.D0.BE.D0.B6.D0.BD.D0.BE.D1.81.D1.82.D0.B5.D0.B9)и здесь (https://habrahabr.ru/post/261955/)


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: vebmaster от Февраль 20, 2017, 20:16
а возможно ли как то управлять колличеством потоков в QThread , как с пулом threadPool->setMaxThreadCount(50)?


Название: Re: QRunnable. Сигнал доходит после завершения потока.
Отправлено: Old от Февраль 20, 2017, 20:22
а возможно ли как то управлять колличеством потоков в QThread , как с пулом threadPool->setMaxThreadCount(50)?
QThread управляет ровно одним потоком.