|
0 / 0 / 0
Регистрация: 23.01.2022
Сообщений: 25
|
||||||
Почему событие по таймеру запускается несколько раз?05.05.2023, 16:10. Показов 1586. Ответов 25
Метки нет (Все метки)
Господа, помогите разобраться. Почему выбранные процессы запускаются по несколько экземпляров (когда 2, когда 3, когда 5)https://github.com/Iov1223/TaskManager - вот сам проект, на всякий случай
0
|
||||||
| 05.05.2023, 16:10 | |
|
Ответы с готовыми решениями:
25
Почему событие срабатывает несколько раз Почему при нажатии кнопки при использовании библиотеки createjs функция запускается несколько раз?
|
|
|
|
| 07.05.2023, 12:54 | |
|
iov1223, да, в запланированное. Но с таймерами проблема в том, что точно в запланированное время они сработать не могут. Вы вызываете его раз в секунду. Поэтому придётся смотреть, была ли запущена задача с прошлого тика таймера, если между прошлым тиком таймера и текущим находится то самое время, когда должна быть запущена задача.
А чтобы не запускать дважды, надо у задачи завести флаг "запущена", ставить его при запуске и не запускать, если флаг уже установлен.
1
|
|
|
0 / 0 / 0
Регистрация: 23.01.2022
Сообщений: 25
|
|
| 07.05.2023, 13:31 [ТС] | |
|
Rius, Спасибо, буду разбираться, если что вернусь обратно, и опять буду доставить сдешних обитателей вопросами
. Но это будет не скоро. Ещё раз всем спасибо
0
|
|
|
0 / 0 / 0
Регистрация: 23.01.2022
Сообщений: 25
|
|
| 07.05.2023, 14:38 [ТС] | |
|
Wolfdp, спасибо. Обязательно проверю, как только доберусь.
0
|
|
|
|
||||||||||||||||||||||||||||||||||||
| 08.05.2023, 10:49 | ||||||||||||||||||||||||||||||||||||
Сообщение было отмечено iov1223 как решение
Решение
Скину будущим "ищу готовое" небольшой рабочий пример.
ТехЗадание
-- форма с гридом задач. В столбцах отображаем "имя приложения" (берется из свойств exe файла), "полный путь к файлу", "ожидаемое время запуска" и "статус" -- статус может быть "ожидает", "запущено", "ошибка", "пропущено" -- внизу формы контролы для выбора файла на запуск (текстбокс с путем к файлу и датапикер для указания времени запуска) -- также есть кнопка очистить все задачи -- при наличии задач со статусом "ожидает", нужно каждую секунду проверять время запуска, и если "да" -- запускаем приложение. Если задач на запуск нет, таймер должен быть остановлен -- если при проверке обнаруживается что задача должна была быть запущена более 10 секунд тому, то считаем что время запуска прошло, и выставляем "пропущено" без запуска программы. Если при запуске вывалило с ошибкой -- проставляем статус "ошибка". -- всю информацию про задачи нужно дополнительно сохранять в базу данных sqlite -- дополнительно есть кнопка "очистить", которая удаляет все задачи (включая ожидающие) и из списка и БД 1. Есть явных два модуля: сам таймер, работающий со списком ожидающих задач и модуль для работы с БД. примечание
Вообще нужно всегда стараться логические блоки выносить в отдельные части, и БД тут не единственный пример. Грубо говоря ваши внутренности должны быть легко переносимы с WinForms на Console. В идеале конечно код должен быть вообще под Unit Test.
2. Из моделей явно есть объект описывающий задачу (путь, статус, время). Для работы с БД, нужно также добавить Id (будем использовать Guid). Также явно нужен enum описывающий статусы. примечание
Отмечу, что в примере ТСа дата, статус -- строки. Так поступать не стоит. Во-первых такой подход череват ошибками из-за кодировки или банально несовпадения регистра. Во-вторых перегоняя в строки, мы совершаем дополнительную работу (код работает медленнее, хоть и не критично, особенно в нашей задаче)
3. Форма. Тут ничего особенного, разве что для Grid добавим отдельную форму для отображения данных (без нормального DataBinding, но чуть упростит вывод данных) Модель данных
- используем таймер из области имен System.Timers. Виндовый таймер нам не подходит, так как "переносимость" и он не предназначен для фоновых задач, а больше для взаимодействия с UI.
- весь модуль сделаем как IDisposable, чтобы можно было быстро грохнуть внутренний таймер - добавляем событие TasksProcessed, чтобы информировать стороние модули, что произошел запуск/ошибка задачи. Модуль БД (файл DbRepository.cs) примечание
Вообще по нормальному, нужна ORM, тот же EF хотя бы... Но раз ТС изначально писал на чистом ADO -- будем использовать его, с некоторыми коректировками.
1. методы Execute для унификации вызова (не то чтобы тут много, но обычно это первое что приходиться велосипедить) 2. введем константы наименования таблиц и колонок. Делается это для того, чтобы сократить вероятность опечаток. SQL в коде в принципе зло (поэтому и исползуют ORM), так как различные ошибки, например банальная опечатка"select * from tassk" обнаружиться только при вызове, а не компиляции. 3. Работаем исключительно через параметры. Никаких ToString в тело sql-запроса, это не безопасно. Просто реализуем необходимые методы: - инициализация БД, если её ещё нет (см. InitDB) - добавления новой таски (AddTask). Никаких проверок, вся валидация -- не уровень ответсвенности БД. - загрузить все имеющиеся таски (LoadTasks), т.к. грузим как для grid все, так и только для модуля с таймером, добавим вариант с флагом "грузить только таски ожидающие запуска". Хотя это можно делать и на уровне выше, а тут просто отдавать всё что есть. - обновить статус таски (UpdateTaskStatus) - очистить базу (Clear) Форма Добавляем модель для отображения (не то чтобы она тут прям сильно нужна, но так кошернее)
1
|
||||||||||||||||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 23.01.2022
Сообщений: 25
|
|
| 08.05.2023, 15:06 [ТС] | |
|
Wolfdp, спасибо огромное, вернусь из отпуска, буду разбирать, вникать, мотать на ус
0
|
|
| 08.05.2023, 15:06 | |
|
событие onclick вызывается несколько раз Событие клика отрабатывает несколько раз Событие ввода текста срабатывает несколько раз Событие MouseWheel в PictureBox срабатывает несколько раз Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|