|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.11.2009, 00:20 | #1 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Варианты реализации программы с использованием таймеров
1) Есть такой вопрос: Подскажите как лучше реализовать программу будильник. Он сидит в трее при нажатии правой кнопки
мышки вылазиет окошко с настройками, списком будильников и т.д. Так как в моей программе будет возможность создать очень много будильников, просто напоминаний и напоминаний дней рождений (ну ещё немного дополнительных функций). То я хочу как-то его оптимизировать, чтобы он не положил слабую систему. Даже если и не положит, хочу максимум оптимизации. Есть варианты: 1) Настраиваю 1-ый будильник на срабатывание такого-то числа, через 15 дней. 2-ой через 5 часов. Ну и ещё штук 10 тоже по разному. Далее эти будильники висят в опиративке и каждую секунду сверяют время, глупо? Думаю даже очень. Идея такая 1-ый проверяет время и дату, если срабатывать ему не сегодня, то интервал проверки 10 часов например. 2-ой проверяет и узнаёт, что ему ещё 5 часов или скажем больше 4-ёх, то интервал 2 часа, потом ещё раз сверяет осталось ему 2 часа интервал, час, потом каждые 10 минут, потом каждую секунду. А ещё можно чтобы был один отдельный таймер, который получал бы каждую минуту или секунду время и каждый раз когда час становиться 0, то ещё и дату, но тогда у таймера каждую секунду добавляется проверка сколько сейчас часов, что лучше проверка или просто получение даты? Потом все будильники уже получают время и дату из переменных, куда записал их этот отдельный таймер. 2)У меня постоянно какая-то навязчивая мысль, что надо как можно меньше компонентов и таймеров и проверок в программу, но не в ущерб функциональности, что таймеры сильно тормозят систему? Или проверка чего либо каждую секунду для компьютера это вообще ничто? У кого какие идеи есть как лучше сделать? Я как-то выкладывал будильник и меня попросили его уменьшить, ну я уменьшил, точнее теперь у него 2 размера. И показывает текущее время так я и там постарался оптимизировать его вот код: Код:
Последний раз редактировалось Casper-SC; 18.11.2009 в 00:22. Причина: веская =) |
18.11.2009, 01:26 | #2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Извините, но это бред...
Хватит одного таймера на 1000 будильников. Ставим один таймер с интервалом 1 секунда, который просто берет текущее системное время. А дальше запускает процедуру проверки. Что она делает? Она определяет, у какого из будильников (а это просто массив переменных) записанное в нем время-дата стало меньше системного. И если такой найден - звоните, запускайте МР3, пусть у вас всплывает окошко с какой-то напоминалкой и т.д. Идея ясна? Тогда - вперед, "под танки" Только не надо, чтобы окошки "вылазили", ладно? Пусть они всплывают или просто появляются, но никак не "вылазят". Нет такого слова в русском языке. Это просто элементарная неграмотность... Последний раз редактировалось mihali4; 18.11.2009 в 01:29. |
18.11.2009, 03:30 | #3 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
mihali4 у меня к Вам вопрос, я как понимаю вы в программировании нехило соображаете. Есть форма, на ней ListView и рядом кнопки "Новый", "Изменить" и т.д. При нажатии на кнопку "Новый" выполняется этот код (приведена основная часть):
Код:
Код:
Код:
Или как сделать такой массив, ведь заране неизвестно сколько будет создано будильников? |
18.11.2009, 08:20 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Хм... Ты помоему малость не в ту степь попер.
У тя есть твой TClock где настроен будильник - некое время когда нужно чет сделать. Прекрасно - прикручиваем к форме Alarms:TObjectList Это будет массивом, хранящим все будильники. Добавляем будильник: Код:
Код:
И все. То что я жирным выделил делать не обязательно. но я не знаю какие у тя действия будут по срабатыванию одного из будильников, потому на всякий случай таймер при проверке луче останавливать.
I'm learning to live...
|
18.11.2009, 13:34 | #5 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Цитата:
Тут мы один нюанс упустили - по срабатыванию любого будильника ему нужно какую-то отметочку делать, что он уже сработал, иначе они как начнут хором каждую секунду вновь запускаться |
|
18.11.2009, 18:59 | #6 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Посмотрел английскую справку и понял почему у меня объект лист не хочет работать, подключил модуль Contnrs, всё заработало.
Я сделал так: Объявил Alarms : TObjectList; в разделе var в том, что перед implementation. В событии формы OnCreate написал: Alarms := TObjectList.Create; Далее я добавляю объект в массив Alarms.Add(Alarm); смотрите в коде: Правильно? Код:
Код:
Последний раз редактировалось Casper-SC; 18.11.2009 в 19:10. |
22.11.2009, 10:44 | #7 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Всё оттестировал, многое дописал в программе, но оказалась одна беда, я из ListView удаляю строку освобождаю как я понял указатель, а не объект удаляю, даже из массива пытаюсь удалить его, только вообще понять не могу удаляется там чё нибудь или нет. Строки из ListView удалены, а будильники продолжают срабатывать.
Подскажите кто нибудь как правильно удалять объекты привязанные к определённой строке ListView и этот же объект к определённому индексу ObjectList. Кнопка "копировать" будильник. Посмотрите тут всё верно? Код:
Код:
----------------------------------------------------- Ну в очередной раз методом проб и ошибок, и чтением кривого перевода справки, X-Translator'ом, я наконец-то разобрался: Вот оно: Это выполняется при копировании будильника: Код:
Нда, щас сделал прогой ProcessExplorer такое дело: открыл окно наблюдения за процессом (так назовём), и смотрю сколько оперативки кушает моя программа, создаю будильник, заполняю текстовые поля очень длинным текстом и потом копирую штук 30 таких же будильников с заполнеными полями, получается килобайт 400 лишних начинает прога кушать, удаляю все будильники, проверка в массиве на срабатывание не даёт результата (что меня радует, этого я и добивался), но оперативка не освобождается!??? Я опять в тупике. Последний раз редактировалось Casper-SC; 22.11.2009 в 12:54. |
27.11.2009, 13:07 | #8 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Появился такой вопрос:
Всё, что в коде имеет в начале букву F, это поля объекта TClock Есть TObjectList , TClock и TListView, когда создаю будильник нажатием на кнопку “Новый”, то создаётся будильник(как создаётся можно посмотреть выше): Для полного понимания моего вопроса Так выглядит проверка привязанных к каждой строке списка ListView будильников: Код:
Код:
FormMessage := TFormMessage.Create(Self); FormMessage.CreateMessage(TClock(Li stViewAlarm.Items.Item[I].Data), ListViewAlarm.Items.Item[I]); Эти строки взяты из примера выше После того как пользователь нажимает в окошке сообщения на кнопку «Закрыть» Происходит следующее: Код:
for I := 0 to (ListViewAlarm.Items.Count - 1) do, если Count уменьшился будет ошибка в цикле, но её вроде нету, так как выключаю таймер (выше в коде всё это есть). Проблема в другом, если в списке ListView один будильник и он в режиме «Один раз», то такой код срабатывает, но если добавить например ещё один с режимом, тоже например «Каждый день», то вылетает ошибка. Помогите пожалуйста, я уже устал над ним колдовать, ничё не могу понять. И вообще зачем тут ObjectList? Я его использую вообще только… по сути вообще не использую, это видно в коде. вот что написано при ошибке: Project AlarmClock.exe raised exception class EAccessViolation with message 'Access violation at address 004B778E in module 'AlarmClock.exe' Read of address 0000000C.' и компилятор выделяет строку if TClock(Form1.ListViewAlarm.Items.It em[I].Data).FToRemoval then |
27.11.2009, 13:33 | #9 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Что-то я запутался
у тебя если некой будильник одноразово стоит то по срабатыванию пусть он себя освобождает из списка в котором он находится.
I'm learning to live...
|
27.11.2009, 16:00 | #10 | |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Цитата:
запускается программа, создаю будильник, появляется он в списке ListView, работает таймер с интервалом 1000 мс. вот что происходит: Код:
Если в списке 7 будильников, то цикл будет повторяться 7 раз, но если при срабатывании я сразу его освобожу внутри цикла, то ListViewAlarm.Items.Count уменьшиться на 1, а цикл попытается всё равно пройти 7 раз и выдаст ошибку. Поэтому я и намутил такое, чтобы при закрытии сообщения останавливался таймер проверки будильников и как я думаю (но не уверен) прерывал цикл. Потом запускается цикл который ищет помеченные будильники, то есть у кого из них поле FToRemoval равно True и удаляет их, после сразу включает таймер дальше проверять будильники. Я пробовал сделать так: К проверке, что написана выше в этом сообщении я добавлял Код:
Что посоветуете? И вообще нужен ли тут TObjectList? Мне посоветовали его использовать, только помоему от него лишних заморочек больше. И ещё я не написал код нажатия на кнопку "Новый" в прошлом моём сообщении из-за того, что сообщение превышало 5000 символов, а там по сравнению с тем кодом куда я сослался есть небольшое изменение, вот: Код:
Последний раз редактировалось Casper-SC; 28.11.2009 в 06:30. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Написание программы с использованием функции | Ветас | Помощь студентам | 5 | 08.11.2009 14:31 |
Прошу вашей помощи в реализации программы по динамическим структурам | technotamplier | Помощь студентам | 0 | 25.10.2009 22:20 |
Программы с использованием операторов ветвления и циклов | Vitas1234 | Помощь студентам | 1 | 11.06.2008 17:41 |
Программы с использованием операторов ветвления и циклов | Vitas1234 | Паскаль, Turbo Pascal, PascalABC.NET | 9 | 11.06.2008 16:18 |