powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создаёт TTimer свой поток или нет?
40 сообщений из 40, показаны все 2 страниц
Создаёт TTimer свой поток или нет?
    #40082689
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Несовсем понятен вопрос,
по исходникам вроде нет поскольку минимум Timer Event стартует в основном потоке.
Но и абсолютной уверенности тоже нет т.к. используется
Код: pascal
1.
function SetTimer; external user32 name 'SetTimer';



Спасибо
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082691
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таймеру не нужен отдельный поток. Он живет в вызывающем.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082729
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barmaley57
Таймеру не нужен отдельный поток. Он живет в вызывающем.

Откуда ты знаешь, как рнализован SetTimer() ?
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082740
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше бы спросить "какая буква из документации по ссылке привела аффтара к странному
заключению о создании потоков"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082742
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, появление / или нет нового потока можно проверить в ProcessExplorer'e создав объект TTimer в рантайме и выставив ему .Enabled :=true
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082752
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Barmaley57
Таймеру не нужен отдельный поток. Он живет в вызывающем.

Откуда ты знаешь, как рнализован SetTimer() ?
Не скажу.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082763
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082792
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень вряд ли таймер "живет" в вызывающем потоке. Вызывающий поток запросто может уйти в длительный запой расчет, не обращаясь вообще к функциям user32 и kernel32. И как тогда таймер сможет выполнить свою работу и отправить вовремя свое сообщение?

SetTimer или запускает новый поток (возможно, не в своем процессе) или, разумнее всего, использует один из готовых системных.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082794
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskySetTimer или запускает новый поток (возможно, не в своем процессе) или, разумнее всего,
использует один из готовых системных.

Ну так проведи эксперимент. Нагрузи главный поток чем хочешь и добейся чтобы
GetCurrentThreadId в OnTimer вернул что-то отличное от главного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082795
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shalamyansky
Вызывающий поток запросто может уйти в длительный запой расчет, не обращаясь вообще к функциям user32 и kernel32. И как тогда таймер сможет выполнить свою работу и отправить вовремя свое сообщение?

Вообще-то, так и происходит.

И даже если система из отдельного треда пошлет сообщение вовремя, это ничего не изменит: сообщения из очереди окна сами собой не обрабатываются.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082797
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
shalamyanskySetTimer или запускает новый поток (возможно, не в своем процессе) или, разумнее всего,
использует один из готовых системных.

Ну так проведи эксперимент. Нагрузи главный поток чем хочешь и добейся чтобы
GetCurrentThreadId в OnTimer вернул что-то отличное от главного.
ОнТаймер - хоть убейся, в "основном" треде.
Имхо, тут вопрос о том, как реализован механизм, включаемый апишным вызовом SetTimer(). Хотя, нафига это знать - непонятно.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082798
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОперационная система Windows позволяет для каждого приложения создать несколько виртуальных таймеров. Все эти таймеры работают по прерываниям одного физического таймера.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082800
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
авторОперационная система Windows позволяет для каждого приложения создать несколько виртуальных таймеров. Все эти таймеры работают по прерываниям одного физического таймера.

И чо?
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082801
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
сообщения из очереди окна сами собой не обрабатываются.

Это да, и это почти нормально, не слишком спешить с обработкой очереди, мы тут важным делом заняты, а пользователи пусть подергаются. Но в данном случае ситуация хуже - тут сообщение даже не будет отправлено. И если, предположим, дело обстоит именно таким образом, вызов какой именно функции выполнит отправку сообщения WM_TIMER, Get/PeekMessage, любой из user32? Коряво как-то.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082803
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
И чо?
А то что доп. потоки не создаются.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082804
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OnTimer, естественно, работает в основном потоке, поскольку он вызван обработчиком очереди этого основного потока при обработке пришедшего WM_TIMER. Вопрос в том, кто, когда и из какого потока отправил WM_TIMER. И вот очень вряд ли, что отправитель WM_TIMER работал из потока, дернувшего SetTimer.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082808
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shalamyansky
...Но в данном случае ситуация хуже - тут сообщение даже не будет отправлено...

Лучше пусть очередь сообщений переполнится? :)
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082810
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky
OnTimer, естественно, работает в основном потоке, поскольку он вызван обработчиком очереди этого основного потока при обработке пришедшего WM_TIMER. Вопрос в том, кто, когда и из какого потока отправил WM_TIMER. И вот очень вряд ли, что отправитель WM_TIMER работал из потока, дернувшего SetTimer.
А вот ты и не угадал.
Ядро устанавливает флаг "timer X сработал" (чтобы очередь не переполнялась), а WM_TIMER пихается в очередь при наличии флага в момент запроса очередного сообщения. Т.е. отправитель - сам поток.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082814
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Ядро устанавливает флаг "timer X сработал" (чтобы очередь не переполнялась), а WM_TIMER пихается в очередь при наличии флага в момент запроса очередного сообщения.

Да, так работает, все-таки при вызове Get/PeekMessage? Ну, так, значит, так. Я чисто логически рассуждал. Но все равно, должен существовать некий сторонний поток, который флаг "timer X сработал" установит. Только оповещение основного потока о событии переместилось на чуть более ранний шаг.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082817
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyдолжен существовать некий сторонний поток, который флаг "timer X сработал" установит.

Не должен. Вместо флага "таймер Х сработал" может быть флаг "следующий таймер в ХХ:ХХ",
который и проверяется функциями выборки. Им всё равно текущее время получать, заодно и
очередь таймеров проверят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082889
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
ОнТаймер - хоть убейся, в "основном" треде.

Ну, допустим, не в основном, а в том, в котором таймер был создан/инициализирован....
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082890
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Dimitry Sibiryakov
пропущено...

Ну так проведи эксперимент. Нагрузи главный поток чем хочешь и добейся чтобы
GetCurrentThreadId в OnTimer вернул что-то отличное от главного.

ОнТаймер - хоть убейся, в "основном" треде.
Имхо, тут вопрос о том, как реализован механизм, включаемый апишным вызовом SetTimer(). Хотя, нафига это знать - непонятно.

Он в том треде, в котором вызвано его создание.
При создании таймера создается окно, которое будет получать сообщения от ос.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082915
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Ну, допустим, не в основном, а в том, в котором таймер был создан/инициализирован....

Ага.
И, раз уж начались разборки, напомню: 18154218
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082919
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

спасибо, любопытно.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082927
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
При создании таймера создается окно,
Корректнее будет фраза: "При создании объекта TTimer создается окно". Потому что при вызове SetTimer окно уже должно существовать. А что это за окно - системе все равно
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082949
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
wadman
При создании таймера создается окно,
Корректнее будет фраза: "При создании объекта TTimer создается окно". Потому что при вызове SetTimer окно уже должно существовать. А что это за окно - системе все равно

Это просто TTimer так сделан, что на каждый тамер свое отдельное окно. Возможно, так сделано, чтобы не заботиться об уникальности id таймера.
Интересно, что в самой процере SetTimer() можно не указывать дескриптор окна, но приэтом задать процедуру таймера. При этом, WM_TIMER будет обработан процедурой окна по умолчанию путем вызова этой процедуры таймера, то есть, нужно как-то дернуть диспетчеризацию сообщений текущего треда, чтобы процедура выстрелила, ну и, WM_TIMER таки должен быть отправлен из текущего треда. :)
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082964
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
можно не указывать дескриптор окна
Кстати, да.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082971
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky
Но все равно, должен существовать некий сторонний поток, который флаг "timer X сработал" установит. Только оповещение основного потока о событии переместилось на чуть более ранний шаг.


Этот "сторонник поток" называется "ядро" (либо "планировщик", либо "диспетчер ядра", либо "диспетчер"), кому как нравится.
Когда речь идёт про контроль прошедшего времени, диспетчер ядра пробуждается каждый раз при срабатывании системного таймера и анализирует, кому какое событие нужно отправить (или установить флаг). В данном случае после установки флага диспетчер всё равно прервёт ожидание программы, которая висит на вызове PeekMessage в ожидании какого-нибудь события.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40082979
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Корректнее будет фраза: "При создании объекта TTimer создается окно".

Уточнять можно бесконечно долго, если не замечать сути беседы: не смотреть на название темы, не учитывать текст из цитаты и т.п.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083000
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во развели тут дискуссию! Окна, трэды. Таймер может и без окна работать. Дергать callback. Установите разрешение таймера в 0 мс и замерьте время срабатывания. Тогда будет понятно, что срабатывание таймера происходит при смене контекста ОСью.
ОСь при планировании пробуждает в очередной раз поток.
А есть ли у тебя таймеры? Есть.
Время вышло? Вышло.
Что у нас там: окно задано или колбэк?
Окно - отправляем WM_TIMER
Колбэк - передаем ему управление.
Всё просто. Никакой магии.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083001
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.07.2021 13:45, Barmaley57 пишет:
> Всё просто. Никакой магии.

Ухнаагийн Хурэлсух!

зы: новый президент Монголии
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083002
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barmaley57
Колбэк - передаем ему управление.

Да шиш там. Все также WM_TIMER, только не туда.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Тогда будет понятно, что срабатывание таймера происходит при смене контекста ОСью.

То есть ты утверждаешь, что квант времени в Windows 18.5 миллисекунд, поскольку именно
таков квант таймера... Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083009
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Barmaley57
Колбэк - передаем ему управление.

Да шиш там. Все также WM_TIMER, только не туда.
Неважно. Важен смысл.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083011
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Barmaley57Тогда будет понятно, что срабатывание таймера происходит при смене контекста ОСью.

То есть ты утверждаешь, что квант времени в Windows 18.5 миллисекунд, поскольку именно
таков квант таймера... Ню-ню...
Я не могу ничего сказать насчет того, как работает твой мозг. И почему в нем генерируются такие мысли. Увы.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083013
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barmaley57
ъъъъъ
пропущено...

Да шиш там. Все также WM_TIMER, только не туда.
Неважно. Важен смысл.

Вот именно.
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083018
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57Я не могу ничего сказать насчет того, как работает твой мозг. И почему в нем генерируются
такие мысли.

Очевидно это потому, что ты нуб и не знаешь, что таймер в Windows ограничен вышеназванным
периодом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083024
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, пшолнах (с)
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083036
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, начнём с вопроса попроще: есть ли вообще хоть какое-то основание подозревать ядро в
участии в работе пользовательских таймеров?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создаёт TTimer свой поток или нет?
    #40083047
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не поленился, посмотрел. Да, SetTimer - ставит пользовательский таймер. Обработка происходит либо в связке Get/Peek/message+DispatchMessage, либо вместо dispatch обрабатываем ручками WM_TIMER. Нет очереди - не работает таймер. В ядро уходит SetWaitableTimer. Но темы порождения/непорождения потоков это не меняет.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создаёт TTimer свой поток или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]