Russian Qt Forum
Ноябрь 22, 2024, 21:58
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Не отрабатывает QTimer::timeout()
Страниц:
1
2
[
3
]
4
5
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Не отрабатывает QTimer::timeout() (Прочитано 30713 раз)
Bepec
Гость
Re: Не отрабатывает QTimer::timeout()
«
Ответ #30 :
Октябрь 04, 2015, 11:52 »
Вариант отличия ПО сервера и десктопа вами рассматривается?
Вполне возможно, что какой нить хитрый механизм оптимизации имеет место быть.
Как то ограничение на количество одновременных потоков для приложения и выделяемых мощностей.
Что вам мешает запускать потоки на выполнение? Не иметь сотню созданных и занимающихся фигней потоков, а иметь менеджера, разруливающего количество потоков и их запуск?
Ну или ещё вариант на мутексах сделать. Никакие таймеры не нужны будут.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Не отрабатывает QTimer::timeout()
«
Ответ #31 :
Октябрь 04, 2015, 12:10 »
Цитата: Bepec от Октябрь 04, 2015, 11:52
Вариант отличия ПО сервера и десктопа вами рассматривается?
Проверял на виртуалке Windows Server в десктопе - все работает как надо
Цитата: Bepec от Октябрь 04, 2015, 11:52
Не иметь сотню созданных и занимающихся фигней потоков, а иметь менеджера, разруливающего количество потоков и их запуск?
Где я тут писал про сотню страдающих фигней потоков? Мои потоки (их ровно половина от имеющихся вычислительных ядер) и играют роль того самого менеджера. "Фигней страдают" воркеры - так на то они и воркеры, чтобы фигней страдать.
Цитата: Bepec от Октябрь 04, 2015, 11:52
Ну или ещё вариант на мутексах сделать. Никакие таймеры не нужны будут.
На каких мьютексах? У меня нет общего ресурса, который нужно защищать мьютексами!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не отрабатывает QTimer::timeout()
«
Ответ #32 :
Октябрь 04, 2015, 12:14 »
Цитата: Old от Октябрь 04, 2015, 11:16
Используется DirectConnection, слоты вызываются напрямую, никаких событий таймера в очередь не кладется.
Напрямую "от кого"? События таймера приходят от OC, не крутим EventLoop - нет и этих событий
Цитата: xokc от Октябрь 04, 2015, 11:27
Особенность воркеров такова, что у них потребность в работе возникает в среднем 10 раз в секунду, а продолжительность выполнения одного шага воркера достаточно мала, так что забивать комп бесконечной проверкой "не созрел ли кто для работы" тоже не хочется. С другой стороны, при достаточно большом количестве воркеров (до 1024) текущая схема тоже не выглядит идеальной. Правильнее было бы потоку спать до момента появления необходимости работать ближайшему воркеру. Но кто его будет будить? Снова таймер?
Ну если 10 раз в секунду, то чем не устраивает избитая схема QWaitCondition::wait и wakeOne?
Edit: впечатление что таймер здесь - явно "не то"
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Не отрабатывает QTimer::timeout()
«
Ответ #33 :
Октябрь 04, 2015, 12:14 »
И все таки... что там с гипертридингом?
Иногда бывают с ним проблемы, не раз замечено.... и именно ка ксеонах.
Записан
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 не волк, в лес не уйдёт
Bepec
Гость
Re: Не отрабатывает QTimer::timeout()
«
Ответ #34 :
Октябрь 04, 2015, 12:18 »
Мутексом можно блочить ресурс, а можно использовать его в качестве контролирующего элемента. Тот же QWaitCondition на этом работает, вроде.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Не отрабатывает QTimer::timeout()
«
Ответ #35 :
Октябрь 04, 2015, 12:23 »
Цитата: Igors от Октябрь 04, 2015, 12:14
Напрямую "от кого"? События таймера приходят от OC, не крутим EventLoop - нет и этих событий
Не от какой ОС ничего не приходит.
Прошел или нет заданный интервал времени определяется в eventloop, и если прошло активируется слот.
А если объект слота получателя находиться в том же потоке, то это сводится к прямому колу.
В общем виде цикл обработки событий обрабатывает таймеры, опрашивает внешние события и обрабатывает сами события из очереди.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Не отрабатывает QTimer::timeout()
«
Ответ #36 :
Октябрь 04, 2015, 12:27 »
Цитата: Igors от Октябрь 04, 2015, 12:14
Ну если 10 раз в секунду, то чем не устраивает избитая схема QWaitCondition::wait и wakeOne?
Кто wakeOne вызывать будет и по какому поводу?
Можно было бы просто ориентироваться на ближайший из просыпающихся воркеров и будить нитку по соответствующему таймауту в QWaitCondition::wait. Но при большом количестве воркеров не будет ли у меня система только и заниматься тем, что засыпать и просыпаться?
Цитата: Igors от Октябрь 04, 2015, 12:14
Edit: впечатление что таймер здесь - явно "не то"
Таймер был взят как документированное средство занять систему в период её бездействия. О том, что тоже думаю, что это не совсем "то", я уже писал.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Не отрабатывает QTimer::timeout()
«
Ответ #37 :
Октябрь 04, 2015, 12:28 »
Цитата: xokc от Октябрь 04, 2015, 11:27
Но кто его будет будить? Снова таймер?
Никаких таймеров, это страшно.
Используйте очередь заданий с условной переменной QWaitCondition, и все будет работать как часы.
На форуме есть несколько тем, где я приводил код таких очередей. Не найдете, пишите наберу еще раз, там пара десятков строк.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Не отрабатывает QTimer::timeout()
«
Ответ #38 :
Октябрь 04, 2015, 12:29 »
Цитата: xokc от Октябрь 04, 2015, 12:27
Кто wakeOne вызывать будет и по какому поводу?
Тот кто будет новую работу добавлять для воркеров.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Не отрабатывает QTimer::timeout()
«
Ответ #39 :
Октябрь 04, 2015, 12:38 »
Новая работа им добавляется ими же
по результатам выполнения предыдущей. Только они сами знают через какое время им нужно снова начать работать. Но ведь их нитка спит, кто же их разбудит?
«
Последнее редактирование: Октябрь 04, 2015, 12:42 от xokc
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не отрабатывает QTimer::timeout()
«
Ответ #40 :
Октябрь 04, 2015, 12:52 »
Цитата: xokc от Октябрь 04, 2015, 11:27
Правильнее было бы потоку спать до момента
появления необходимости работать
ближайшему воркеру. Но кто его будет будить?
Вот это место "осветите" - как (или откуда) появляется собственно "задание"
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Не отрабатывает QTimer::timeout()
«
Ответ #41 :
Октябрь 04, 2015, 13:01 »
Цитата: Igors от Октябрь 04, 2015, 12:52
Цитата: xokc от Октябрь 04, 2015, 11:27
Правильнее было бы потоку спать до момента
появления необходимости работать
ближайшему воркеру. Но кто его будет будить?
Вот это место "осветите" - как (или откуда) появляется собственно "задание"
Каждый из воркеров знает через какое время ему стоило бы сделать свою очередную порцию работы. Соответственно, нитка могла бы пробежаться по воркерам, узнать какой из них должен начать работу первым и когда именно это должно произойти, а до того момента заснуть.
Если бы не необходимость ещё и обрабатывать события в этой самой нитке.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Не отрабатывает QTimer::timeout()
«
Ответ #42 :
Октябрь 04, 2015, 13:24 »
Подобные вещи я делаю так. Каждый воркер имеет свой внутренний таймер, запущенный с заданным интервалом. При срабатывании - делаем работу.
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Не отрабатывает QTimer::timeout()
«
Ответ #43 :
Октябрь 04, 2015, 13:27 »
Хм. Что-то с таймерами мне больше не хочется иметь дела.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Не отрабатывает QTimer::timeout()
«
Ответ #44 :
Октябрь 04, 2015, 13:28 »
Цитата: xokc от Октябрь 04, 2015, 13:27
Хм. Что-то с таймерами мне больше не хочется иметь дела.
А как без них время засекать? Крутить свой цикл с проверкой сколько крутим - будет еще хуже.
Тем более там у вас интервалы будут в секундах.
Записан
Страниц:
1
2
[
3
]
4
5
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...