Russian Qt Forum
Июнь 16, 2024, 10:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Не отрабатывает QTimer::timeout()  (Прочитано 29764 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #45 : Октябрь 04, 2015, 13:49 »

Правильнее было бы потоку спать до момента появления необходимости работать ближайшему воркеру. Но кто его будет будить?
Вот это место "осветите" - как (или откуда) появляется собственно "задание"
Каждый из воркеров знает через какое время ему стоило бы сделать свою очередную порцию работы. Соответственно, нитка могла бы пробежаться по воркерам, узнать какой из них должен начать работу первым и когда именно это должно произойти, а до того момента заснуть.
Если бы не необходимость ещё и обрабатывать события в этой самой нитке.

Хм.. а чем не устраивает вариант, после того как воркер отрабатывает, отправлять его в слип на 10мс, к примеру? Проснулся - сделал работу - уснул.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #46 : Октябрь 04, 2015, 13:55 »

Хм.. а чем не устраивает вариант, после того как воркер отрабатывает, отправлять его в слип на 10мс, к примеру? Проснулся - сделал работу - уснул.
Для маленких интервалов (< 1 сек) - еще ничего, а для больших начинаются неприятности при завершении работы нитки. Вы сказали останавливайся, а остановиться он реально после того как закончится sleep, если это несколько секунд - уже заметно.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #47 : Октябрь 04, 2015, 14:00 »

Хм.. а чем не устраивает вариант, после того как воркер отрабатывает, отправлять его в слип на 10мс, к примеру? Проснулся - сделал работу - уснул.
Для маленких интервалов (< 1 сек) - еще ничего, а для больших начинаются неприятности при завершении работы нитки. Вы сказали останавливайся, а остановиться он реально после того как закончится sleep, если это несколько секунд - уже заметно.

Это понятно, но разве это не то, что хочет автор? Чтобы воркеры спали определенное время после завершения?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Октябрь 04, 2015, 14:04 »

Каждый из воркеров знает через какое время ему стоило бы сделать свою очередную порцию работы. Соответственно, нитка могла бы пробежаться по воркерам, узнать какой из них должен начать работу первым и когда именно это должно произойти, а до того момента заснуть.
Если бы не необходимость ещё и обрабатывать события в этой самой нитке.
А если так: завести еще "нитку 2"

1) нитка с воркрами делает ту самую пробежку и посылает "сигнал2" нитке 2
2) получив "сигнал2" нитка 2 спит заданное время если время ни одного из воркеров еще не пришло -  иначе сразу посылает "сигнал1" нитке с воркерами
3) получив "сигнал1" нитка с воркерами обслуживает готовых и возвращается к пункту 1
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #49 : Октябрь 04, 2015, 14:07 »

Это понятно, но разве это не то, что хочет автор? Чтобы воркеры спали определенное время после завершения?
Хочет этого, но наверное и завершаться быстро тоже хочет.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #50 : Октябрь 04, 2015, 14:15 »

Это понятно, но разве это не то, что хочет автор? Чтобы воркеры спали определенное время после завершения?
Хочет этого, но наверное и завершаться быстро тоже хочет.

Ну, мы это решаем просто: воркер в run () проверяет флаг завершения и флаг наличия работы. Если сказано завершиться, умираем. Если работать, работаем. Иначе короткий сон и все повторить.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #51 : Октябрь 04, 2015, 14:17 »

Ну, мы это решаем просто: воркер в run () проверяет флаг завершения и флаг наличия работы. Если сказано завершиться, умираем. Если работать, работаем. Иначе короткий сон и все повторить.
Спать придется всей нитке. Во время её сна не будут приниматься события. Если воркеров будет достаточно много, оверхед на процессы засыпания/побудки не получится слишком большим?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #52 : Октябрь 04, 2015, 14:17 »

Ну, мы это решаем просто: воркер в run () проверяет флаг завершения и флаг наличия работы. Если сказано завершиться, умираем. Если работать, работаем. Иначе короткий сон и все повторить.
Я про это говорил чуть выше, это ручная эмитация работы таймера QTimer. Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #53 : Октябрь 04, 2015, 14:23 »

А если так: завести еще "нитку 2"
1) нитка с воркрами делает ту самую пробежку и посылает "сигнал2" нитке 2
2) получив "сигнал2" нитка 2 спит заданное время если время ни одного из воркеров еще не пришло -  иначе сразу посылает "сигнал1" нитке с воркерами
3) получив "сигнал1" нитка с воркерами обслуживает готовых и возвращается к пункту 1
Хотелось бы, чтобы диспетчеризацией кто-нибудь другой занимался, типа ОС Улыбающийся. По предложенному:
1. Нитка 1 после 1-го пункта спит по QWaitCondition::wait?
2. Нитка 2 посылает сигнал по wakeOne?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #54 : Октябрь 04, 2015, 14:26 »

Ну, мы это решаем просто: воркер в run () проверяет флаг завершения и флаг наличия работы. Если сказано завершиться, умираем. Если работать, работаем. Иначе короткий сон и все повторить.
Я про это говорил чуть выше, это ручная эмитация работы таймера QTimer. Улыбающийся

Да, но облегченный вариант, никаких объектов таймера и сигналов Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #55 : Октябрь 04, 2015, 14:45 »

Хотелось бы, чтобы диспетчеризацией кто-нибудь другой занимался, типа ОС Улыбающийся. По предложенному:
1. Нитка 1 после 1-го пункта спит по QWaitCondition::wait?
2. Нитка 2 посылает сигнал по wakeOne?
1) Нет, тупо sleep.
2) Нет, просто проснулась - шлет сигнал с QueuedConnect и опять повисает на своем EventLoop

Да, это самопальный таймер, но с той разницей что ОС не может его "задвинуть взад" как он любит делать. Если время sleep значительно - порезать, напр
Код
C++ (Qt)
while (sleepMs > 0) {
int step = qMin(sleepMs, sleepStep);
sleepMs -= step;
if (abortFlag) ...
sleep(step);
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #56 : Октябрь 04, 2015, 15:36 »

1. А не пробовали менять тип таймера http://doc.qt.io/qt-5/qt.html#TimerType-enum?

2. Вероятно что в ядре серверной ОС есть какие-то различия, если в десктопной работает -  а в серверной - нет. Я не уверен что qt-цы тестят свою поделку Qt на серверных ОС (надо глянуть как-нить для интереса на список ихних CI).

А таймер вообще работает в серверной ОС, если не использовать потоки? Проверял кто-нить просто стартануть таймер и посмотреть что оно скажет? Мож баг какой?  Строит глазки


Записан

ArchLinux x86_64 / Win10 64 bit
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #57 : Октябрь 04, 2015, 16:37 »

Ну, мы это решаем просто: воркер в run () проверяет флаг завершения и флаг наличия работы. Если сказано завершиться, умираем. Если работать, работаем. Иначе короткий сон и все повторить.
Спать придется всей нитке. Во время её сна не будут приниматься события. Если воркеров будет достаточно много, оверхед на процессы засыпания/побудки не получится слишком большим?

В смысле всей нитке? Если каждый воркер - это отдельная нитка, то спать и просыпаться будет только он сам.

Насчет оверхеда - это вряд ли, по крайней мере я такого на наших проектах не замечал. Оверхед заметен при создании и запуске тредов, но после того, как тред запущен - не думаю, что это как-то скажется на производительности. Да, еще коннект сигнал-слотов и их активация - тоже не бесплатна, к слову.

У нас другая неприятность как-то была - по-разному отрабатывали треды, созданные через QThread, и треды, созданные через WinAPI, в разных осях (в 7 и 8 ), насколько я помню.

И все-таки, Hyperthreading пробовали выключить?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #58 : Октябрь 04, 2015, 16:47 »

В смысле всей нитке? Если каждый воркер - это отдельная нитка, то спать и просыпаться будет только он сам.
Каждый воркер - НЕ отдельная нитка. В одной нитке до 256 воркеров.

И все-таки, Hyperthreading пробовали выключить?
Не, не пробовал. Слишком жирно будет ради этого HT убирать. Да и потом, на i7 с включенным HT всё работает предсказуемо.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #59 : Октябрь 04, 2015, 16:52 »

1. А не пробовали менять тип таймера http://doc.qt.io/qt-5/qt.html#TimerType-enum?
Не пробовал, думаю что не поможет. Если настаиваете - попробую. Просто всё "разломал" уже: от таймеров избавился и переделал на invokeMethod, там всё работает более предсказуемо.

2. Вероятно что в ядре серверной ОС есть какие-то различия, если в десктопной работает -  а в серверной - нет. Я не уверен что qt-цы тестят свою поделку Qt на серверных ОС (надо глянуть как-нить для интереса на список ихних CI).
На Windows Server пробовал в виртуалке на десктопном железе - работает нормально.

А таймер вообще работает в серверной ОС, если не использовать потоки? Проверял кто-нить просто стартануть таймер и посмотреть что оно скажет? Мож баг какой?  Строит глазки
"Просто" работает. Даже в моём варианте из 20 ниток 17 стартуют нормально .
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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