|
0 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 2
|
||||||
Таймер срабатывает неверное количество раз15.03.2017, 17:29. Показов 4855. Ответов 8
Метки нет (Все метки)
Доброго времени суток, друзья!
Помогите пожалуйста разобраться! Необходимо производить действие с некоторой периодичностью. Во всех туториалах пишут, что надо использовать Windows.Forms.Timer, но в таком случае, падает точность, так как всё выполняется в одном процессе и таймер тикает медленнее, чем должен. Нашёл в сети, что можно использовать Threading.Timer, чтобы действие таймера происходили в другом процессе и ничего ему не мешало. Нашёл на сайте https://msdn.microsoft.com/ru-... x#Anchor_5 как пользоваться этим таймером, переделал немного под свои нужды, но работает не так как хотелось бы.. В общем вот код:
Что я делаю неправильно?
0
|
||||||
| 15.03.2017, 17:29 | |
|
Ответы с готовыми решениями:
8
Почему таймер срабатывает несколько раз? При вызове функции через поток кнопкой все проходит корректно, но через таймер срабатывает только раз
|
|
|
||
| 15.03.2017, 20:52 | ||
|
Нужно делать так: 1) Таймер должен тикать примерно раз в 10 чаще чем те интервалы, которые вам нужны. 2) Нужно создать поле типа DateTime, которое будет хранить время следующего срабатывания. В тике таймера нужно проверять наступило ли время для срабатывания. 3) Если время срабатывания наступило - выполнить нужное действие и сгенерировать следующее время срабатывания (добавить к времени срабатывания константу - например 10 секунд). 4) Если действие длиннее чем интервал времени - то вынесите выполнение в отдельный поток (то есть в тике таймера создавайте и запускайте новый поток).
1
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||
| 15.03.2017, 21:11 | |||
|
И вот, кстати, таблица с особенностями таймеров
0
|
|||
|
|
|||
| 15.03.2017, 21:31 | |||
|
Для того, что бы избавиться от этого принципиальной погрешности - нужно не опираться на тики, а вести собственный счетчик времени. Ну а таймер должен срабатывать достаточно часто, что бы обеспечить точность времени срабатывания. (знаю, объясняю коряво, но на пальцах это тяжело объяснить )Кроме того, точность представления не важна, поскольку сам таймер имеет погрешность аж 20 мс.
1
|
|||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||||||||||
| 15.03.2017, 21:40 | ||||||||||||
|
Впрочем, вот, написал супер-таймер ![]() Кликните здесь для просмотра всего текста
Вывод: Кликните здесь для просмотра всего текста
0
|
||||||||||||
|
|
|
| 15.03.2017, 21:53 | |
|
TopLayer, Ну если брать конкретно вашу реализацию, то согласитесь, что она не очень.
Во-первых вы заняли отдельный поток. Если таких таймеров нужно 100 штук, то вы будете держать 100 отдельных потоков... Это плохо. Кстати если покопаться в том же Threading.Timer, то там очень хитро реализовано, и там не занимается отдельный поток под каждый таймер. Во-вторых вот этот цикл: while (_sw.Elapsed < _nextTick) ; будет просто греть процессор, без всякой полезной нагрузки.Ну и есть еще много тонких моментов. Например то, что у вас следующий тик не наступит, если не завершился предыдущий тик. А еще ваш таймер нельзя остановить или приостановить. А еще вот представьте ситуацию - у вас есть сервис который делает бекапы. Делать он должен каждые 24 часа. Допустим вы запустили свой супертаймер и поставили время 24 часа. Но в течении этих 24 часов компьютер мог много раз перезагружаться и ваш интервал - не будет иметь смысла после перезапуска программы. С абсолютным временем таких проблем нет.
2
|
|
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||
| 15.03.2017, 22:11 | ||||
|
Запустил 200 таймеров с интервалом 1 сек. Показывает +20 потоков (где-то 11 потоков и с одним таймером). Вот если await Task.Delay заменить на Thread.Sleep, тогда да, +200 потоков.
1
|
||||
|
|
||
| 15.03.2017, 22:18 | ||
|
И кстати вы просто переложили проблему с одних плеч на другие. Потому что методу Task.Delay тоже нужно как-то проверять, наступило ли нужное время. Как он это проверяет? Наверняка тем же самым таймером, и наверняка тики там с максимальной частотой. То есть внутренняя реализация Delay все равно будет такой как я предлагал в посте #2.
1
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||
| 15.03.2017, 22:33 | ||||
|
По-прежнему не вижу смысла в десятикратном тиканьи. Нужна точность - грей процессор. Нужно соблюдение среднего времени интервала - корректируй время следующего тика на каждом предыдущем. А 10 лишних тиков - ни к чему.
1
|
||||
| 15.03.2017, 22:33 | |
|
Помогаю со студенческими работами здесь
9
Таймер срабатывает раньше времени или вообще не срабатывает Как запускать таймер определенное количество раз? Почему деструктор срабатывает больше раз, чем количество созданных объектов? Не срабатывает таймер в QT Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|