|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||||||||||||
Бесконечный цикл c Timer start/stop14.05.2021, 18:42. Показов 6642. Ответов 29
Метки нет (Все метки)
Создал таймер.
При такой реализации у меня бесконечный цикл "блокирует" основной UI поток. Вопрос весьма простой: как я могу не блогировать UI поток этим вечным циклом, при этом используя Timer? Я бы мог сделать асинхронно или чере Task.Run() и т.д., но как я знаю Timer сам по себе поток. Есть пример, но он не абстрактный, а под WinForms, я пытаюсь сделать так, чтобы он был как отдельный, не зависящий от UI проект. Пример WinForms: Кликните здесь для просмотра всего текста
0
|
||||||||||||||||||||||||||
| 14.05.2021, 18:42 | |
|
Ответы с готовыми решениями:
29
Суть методов Start и Stop класса Timer
Бесконечный цикл |
|
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
|
|
| 14.05.2021, 18:56 | |
|
Как-то пробовал делать свой мессенджер (ну как мессенджер, баловство
). И там я использовал отдельный поток для прослушки входящих данных (сервер). В конце метода (вызываемого в потоке) просто сделал вызов этого же метода, по сути рекурсия. Все нормально работало и не висло.Тот же бесконечный цикл
0
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 14.05.2021, 18:59 [ТС] | |
|
Tatarin78, спасибо за ответ, но рекурсия, -- в данном случае -- не то, чего ожидаю услышать.
Но как вариант -- учту.
0
|
|
|
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
|
|||||||||||
| 14.05.2021, 19:22 | |||||||||||
|
Я в вашей реализации не пойму, как вообще используется таймер, если вы его останавливаете постоянно? Может он там и не нужен?
0
|
|||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 14.05.2021, 20:51 [ТС] | |
|
Tatarin78, это мне стукнула в голову идея, мол "чтобы у меня не запустилось 2 раза, сделаю-ка я стоп".
0
|
|
|
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
|
|
| 14.05.2021, 21:34 | |
|
limeniye, Зачем UI потоку знать о том, что работает монетоприемник?
1
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 14.05.2021, 22:37 [ТС] | ||
|
aenye, хм, UI поток в любом случае должен знать про состояние работы монетоприёмника.
Работать они должны в разных потоках; информция должна упакововаться в события и отправляться почтой России (из потока приёмника в Dispatcher UI потока). Возможно я что-то не правильно понимаю и заблуждаюсь, я в программировании ещё маслёнок
0
|
||
|
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
|
|
| 15.05.2021, 03:55 | |
|
limeniye, Монетоприемник работает в фоновом режиме и о активностях может уведомлять через события. А кто, как и где эти события обработает - его заботить не должно.
На случай сбоя - то же самое: крутимся в цикле опроса (по RS232, например), потеряли соединение - дернули событие, если нужно - пытаемся реконнектится.
1
|
|
|
Модератор
|
|||||
| 15.05.2021, 09:03 | |||||
Сообщение было отмечено limeniye как решение
РешениеВозможно они есть в том "миллиарде строк", который вы не показали. Добавлено через 3 минуты StartDevice()?Возможно вы выполняете его однократно в UI потоке. Тогда на время его выполнения GUI может заморозиться. А события таймера работают на пуле потоков, поэтому вызов метода RunCoinValidator не может блокировать GUI.Добавлено через 2 минуты В первоначальном вы используете System.Timers.Timer.А в этом примере System.Windows.Forms.Timer.Таймер из Форм работает в UI потоке, так же как WPF таймер DispatcherTimer. Добавлено через 1 минуту В примере объявлен метод MainLoop().А где он вызывается? Добавлено через 3 минуты Таймер должен быть, вообще, в Модели, а не на Форме или в Окне.
1
|
|||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||
| 15.05.2021, 11:47 [ТС] | ||||||||||||||
aenye, да, через события и делаю.
Добавлено через 9 минут Элд Хасп, можно тут подробней?
0
|
||||||||||||||
|
Модератор
|
||||
| 15.05.2021, 13:58 | ||||
|
сли же он вызывается из системного таймера, то он выполняется на пуле потоков и не должен влиять на GUI. В целом у вас здесь несколько взаимоисключающих вариантов. Надо не гадать как у вас реализовано, а точно знать. Добавлено через 1 минуту Время исполнения которых единицы миллисекунд. Добавлено через 7 минут В основном в задачах (Task). Если долгий метод изменяет состояние Модели (какие-то её данные), то создаётся событие (можно асинхронное). ViewModel (или Контролер, Презентер) ловит это событие, обрабатывает его данные и, если надо, передаёт их в GUI в основном потоке. Для привязок WPF переход в основной поток не требуется. Для привязок Форм - не знаю. Надо проверять. Но для работы непосредственно с UI элементами, что в WPF, что в Формах - переход в UI поток обязателен.
1
|
||||
|
Модератор
|
||||||||||||||||||||||||||
| 16.05.2021, 14:52 | ||||||||||||||||||||||||||
Сообщение было отмечено limeniye как решение
Решение
limeniye, у вас получился очень разбросанный функционал.
Управление ФИЗИЧЕСКИМ устройством у вас чуть ли не в GUI реализовано. Условно, для WPF- MVVM как это должно выглядеть. Для работы непосредственно с физическим устройством у вас должна быть создана Модель. В ней должны быть методы для получения/отправки данных и события. Если нужно реализовывать какой-то временной цикл для работы с физическим устройством, то он должен быть инкапсулирован в Модели. Так же если физическое устройство не позволяет создание параллельных методов доступа, то должен быть реализован Singleton. В целом должно быть что подобное: 1) Аргументы событий:
2
|
||||||||||||||||||||||||||
|
Модератор
|
|
| 16.05.2021, 14:56 | |
|
limeniye, далее ViewModel подписывается на события Модели и прослушивая их обеспечивает актуальные данные монетоприёмника в своих свойствах, которые используются в View для привязки.
Сколько VM будут использовать эту Модель - не важно. Реализация потокобезопасности (если нужно) должна быть в самой Модели.
2
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
| 17.05.2021, 12:10 [ТС] | |||||||||||
|
Элд Хасп, я так понял CoinAcceptorExecute отвечает за то, чтобы включить валидатор. В таком случае мне не нужен вообще бесконечный цикл, как я понимаю.
Касательно Singlton. У Вас есть такой вот код:
0
|
|||||||||||
|
Модератор
|
||
| 17.05.2021, 13:10 | ||
|
Это же зависит от параметров физического оборудования, предъявляемых им требований. Просто вы писали о появлении сбоев, при добавлении VM, поэтому скорее всего есть какие-то ограничения на одновременный доступ. В принципе, такие ограничения, для последовательных внешних устройств довольно частое явление. У вас идёт подключение через порт. И если одна задача начала свою передачу и в этот же момент другая начнёт свою - то скорее всего будет неразбериха и сбой. Как конкретно надо поступать в вашем случае - надо читать документацию на монетоприёмник и его API.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 17.05.2021, 14:01 [ТС] | |
|
Элд Хасп, пока что всё работает без сбоев, как швейцарские часы.
Теперь при открывании окна приложение не сбоит, меня это радует. Огромное Вам спасибо!) Не по теме: Больше меня радует то, что я почитал о Singlton и мне стало более понятно, зачем Вы пишите приватные конструкторы. Если я теперь понял корректно: Singlton нужен для того, чтобы можно было создать только 1 объект. Я видел как Вы делали это в NotifyChangedArgsHendler(не помню как точно), и использовали там Singlton. Зачем? В каких случаях это необходимо?
0
|
|
|
Модератор
|
||||
| 17.05.2021, 15:19 | ||||
|
Добавлено через 1 минуту Даже название ничего не навевает. Добавлено через 48 секунд
1
|
||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 18.05.2021, 01:19 [ТС] | |
|
Элд Хасп, нашёл баг.
Есть функция вывода монет из валидатора. Допустим валидатор пустой а я пытаюсь из него что-то вывести. Я отправляю запрос для вывода — приходит false, так и должно быть. Но когда я очень быстро кликаю на кнопку и отправляю за секунду 4-5 запросов -- валидатор "падает". С примере с формами подоброй проблемы не возникает почему-то. Что может вызывать такую проблему?
0
|
|
|
Модератор
|
||
| 18.05.2021, 08:40 | ||
|
Возможно в Форме вы всё делали в одном потоке: пока кликкер не отработает Форма замораживалась и следующий клик по кнопке не проходил. Валидатор - это Модель. И если какие-то методы Модели можно вызывать не всегда, то их надо оборачивать в команды. 1) Вызывается Execute команды; 2) Первыми в методе идёт проверка флага более раннего вызова - bool isExecute. Если флаг поднят, то выход или исключение; 3) Поднятие флага; 4) Выполнение метода; 5) Сброс флага; 6) Выход из Execute метода. Метод CanExecute возвращает инверсию флага. Так же можно прокинуть состояние этой команды до команды кнопки в GUI, что вызовет отключение кнопки пока Модель занята.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||
| 18.05.2021, 10:22 [ТС] | |||||||
Касательно Execute. Да, я подумал в первую очередь об этом. Но в примере с формами всё отрабатывает идеально, что меня смущает. Я попробовал сделать
0
|
|||||||
| 18.05.2021, 10:22 | |
|
Помогаю со студенческими работами здесь
20
Бесконечный цикл Бесконечный цикл Бесконечный цикл
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
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. . .
|