Russian Qt Forum
Ноябрь 22, 2024, 15:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QRunnable. Сигнал доходит после завершения потока.  (Прочитано 8066 раз)
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« : Февраль 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);
но сигналы доходят после завершения потоков. Почему так?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 13, 2017, 09:26 »

Не совсем понял проблему, но мне кажется, что все дело в Qt::QueuedConnection при соединение, в итоде ты сигналы и получаешь не сразу после waitForDone.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #2 : Февраль 13, 2017, 22:24 »

вот я добавил допустим 10 заданий в пул (пул на 50 потоков)
Код:
threadPool->start(worker);
в worker выполняется работа, которая может занимать разное время, и отправляется сигнал в родительский объект. И у меня получается так, что все 10 сигналов дойдут до слота после завершения всех 10 заданий в одну и туже секунду, а не когда он был отправлен.
Т.е. если первый поток справился за 1 секунду и отправил сигнал, а 10й поток завершился за 30 секунд, то сигнал от 1-го потока всё равно прийдёт когда завершится 10й. (прийдут все 10 сигналов за раз)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 13, 2017, 22:57 »

waitForDone убери
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 14, 2017, 12:07 »

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

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #5 : Февраль 14, 2017, 19:41 »

waitForDone убери
тоже самое

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

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #6 : Февраль 20, 2017, 20:14 »

разобрался, спасибо, у куРуннабле отсутствует цикл обработки событий и сигналы во вне он отправлять не может.
подробнее здесь и здесь
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #7 : Февраль 20, 2017, 20:16 »

а возможно ли как то управлять колличеством потоков в QThread , как с пулом threadPool->setMaxThreadCount(50)?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Февраль 20, 2017, 20:22 »

а возможно ли как то управлять колличеством потоков в QThread , как с пулом threadPool->setMaxThreadCount(50)?
QThread управляет ровно одним потоком.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.