![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
Добрый день. В программировании я полный нуб, и терминологии почти не знаю, так что не ругайтесь из-за возможно глупых вопросов.
Необходимо написать программу, которая будет висеть в трее, и которая в полночь удаляет файл, а в 8 утра копирует его из резервной копии. С копированием и удалением я разобрался, а вот с автоматизацией этого - нет. Как сделать, чтобы процедуры удаления и копирования выполнялись в определенное время? |
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Самое простое (и не самое лучшее) решение - повесить таймер с интервалом около 1 минуты (хотя и это много - можно и пореже).
Это предполагает, что компьютер включен постоянно, либо нужно будет при его включении/выключении загружать/сохранять даты последних действий. в объявление класса сервиса включить:
В OnTimer написать примерно так:
У этого кода есть недостаток: первое срабатывание будет сразу же, как только сработает таймер (удаление - при первом срабатывании, копирование - при втором). Это сообщение отредактировал(а) kami - 5.6.2009, 18:26 |
||||
|
|||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
а если не использовать дату а брать только hh и mm?
|
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Тогда с таймером в общем случае задача, скорее всего невыполнима. Потому что таймер - объект не точный. Т.е. если выставить у него в интервал секунду, то это далеко не означает, что следующее срабатывание его будет ровно через секунду. Таким образом, нельзя сказать, что он в обязательном порядке сработает в 00:00:00, может - чуть раньше, может - чуть позже. Хотя... можно попробовать так: вместо FLastDelDate и FLastCopyDate объявить
В OnTimer прописать:
|
||||
|
|||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
Спасибо, буду пробовать.
Если честно мало что понимаю, пробую и так и эдак, используя листинги различных примеров. Хреново получается, но думаю, что-нибудь, да будет |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
Мне просто неудобно всё спрашивать. Буду стараться и своей головой думать. Не зря ж на программиста решил учиться Это сообщение отредактировал(а) Romany4 - 5.6.2009, 23:05 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
|
|||
|
||||
| Proxin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 21.6.2008 Репутация: 1 Всего: 3 |
||||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
Нашел такой код:
Проверил - работает, но как именно он работает - я не понял. Кто-нибудь может прокомментировать? Для чего объявляется переменные ContinueLoop: BOOL; FSnapshotHandle: THandle; Что за result:=0? Она ведь нигде не объявляется? А дальше вообще дебри. Ничего не понял |
|||
|
||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
kami, сейчас расскажу в чем вообще суть программы. Программа нужна для того, чтобы менять IP-фильтры приложения FlyLink DC++. У нас в регионе проблема с тарификацией трафика в зависимости от времени суток. Ночью фильтры не используются, так как трафик становится бесплатным, поэтому после полуночи я удаляю файл фильтра. А с утра, в 8 часов, вновь его создаю или копирую из резерва. Чтобы фильтры имели силу после смены, требуется перезапустить клиент DC++. Для этого мне и нужно завершить его процесс, и вновь запустить. На данный момент я не знаю всех методов выполнения конкретной задачи, поэтому использую что могу. Не знаю, как правильно завершить процесс FlyLinkDC.exe, поэтому предложил известный мне вариант. Если знаете как корректно завершить работу программы - подскажите. Программа обычно свернута в трей и не имеет открытого окна (видел способы закрывать окна программы, что в данном случае сработало бы). И еще, если завершить работу программы как следует, то программа выгружается не сразу, а спустя короткое время. Мне же необходимо после закрытия клиента вновь его запустить, но если клиент не успел выгрузиться - в диалоговом окне предложится запустить копию, что нежелательно и к тому прервет автоматизацию процесса перезапуска. Вот такие пироги |
|||
|
||||
| kami |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Если окно не "висит" на экране, это не значит, что его нет (как и суслика в ДМБ Завершение процесса через TerminateProcess - это жестокая вещь, означающая, что процесс перестает существовать даже не успев мявкнуть. Не говоря уже о том, чтобы корректно завершить свою работу и деинициализировать все, что использует. И делать так нужно в крайних, не терпящих отлагательства случаях. Поэтому если есть возможность - лучше завершить правильно. И подождать завершения используя WaitForSingleObject. ContinueLoop: BOOL; Эта переменная содержит результат выполнения функций Process32XXX. Потому что если хоть одна не выполнена, то дальнейшее выполнение кода теряет смысл. FSnapshotHandle: THandle; - это идентификатор снимка списка процессов. Сперва создается снимок (CreatexxxSnapshot), а потом из него получаем информацию о первом процессе (Process32First) и последующих (Process32Next). Result - это то, что вернется после вызова этой функции. Любая ф-я неявно имеет эту переменную. И она более чем используется (нужно только код нормально отформатировать, все станет видно). Result:=0; - мы же заранее не знаем, выполнятся ли Create...Snapshot и Process32XXX? Значит, в случае их не-отработки нужно вернуть результат "все плохо", т.е. 0. А дальше проходя по списку процессов и найдя нужный:
И результатом будет уже то, отработало ли TerminateProcess или нет. |
||||||
|
|||||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
Это ладно. Потом разберусь. Я что-то с формой намудрил. Теперь при запуске появляется такое:
![]() Копался только в Properties Формы (и только) Не подскажете где искать решение? Добавлено через 3 минуты и 14 секунд Здесь свои посты нельзя удалять? Поторопился, вместо того, чтобы пораскинуть мозгами. Поменял FormStyle на Child получил ошибку. |
|||
|
||||
| Romany4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 5.6.2009 Где: Джамбул Репутация: нет Всего: нет |
kami, Большое спасибо за помощь. Худо-бедно программу реализовал, основные функции выполняются. Процесс завершаю всё-таки через TerminateProcess. Осталось ждать предложений от сотоварищей по хабу, и вносить изменений. Думаю работы будет много.
Перво-наперво хочу поместить иконку в трей, чтобы программа не отображала окно вообще. Вы согласитесь помочь в случае чего? Чтобы не засорять форум буду писать в этой теме. |
|||
|
||||
| THandle |
|
||||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Вот ссылка по трею: http://forum.vingrad.ru/index.php?showtopi...t&p=1425160 Остальные вопросы задавайте в новых темах. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |