Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 16.04.2014, 11:31
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Ребят, у меня последний вопрос, который меня очень сильно интересует
Подскажите кто гуру - вот мне надо делать опрос текущей даты и сравнивать с заданной, если они равны - то выполнять действие. Если я сделаю это с помощью TTimer - какие промежутки опроса по времени сделать, и будет ли такой способ есть память? Может существует более гуманный способ?
Спрашиваю это потому что сделав опрос через TTimer и поставив интервал в 1 секунду - у меня запущенное приложение медленно, по 4КБ но жрет память - при запуске приложение потребляло 3400кб памяти, за пол часа работы приложения, размер используемой памяти приложением вырос до 3504кб... мне это не нравится, если так будет продолжаться то спустя определенное кол-во времени приложение начнет жрать памяти как файерфокс с 30-ю вкладками - что очень печально
Ответить с цитированием
  #17  
Старый 16.04.2014, 11:50
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Ahton
Подскажите кто гуру - вот мне надо делать опрос текущей даты и сравнивать с заданной, если они равны - то выполнять действие.
Узнать текущую дату можно функцией Date. Сравнивать даты обычной операцией сравнения.
Цитата:
Сообщение от Ahton
Если я сделаю это с помощью TTimer - какие промежутки опроса по времени сделать,
Дата меняется раз в сутки.
Цитата:
Сообщение от Ahton
и будет ли такой способ есть память?
В каком смысле?
Цитата:
Сообщение от Ahton
Может существует более гуманный способ?
TTimer - это достаточно гуманный способ
Цитата:
Сообщение от Ahton
Спрашиваю это потому что сделав опрос через TTimer и поставив интервал в 1 секунду - у меня запущенное приложение медленно, по 4КБ но жрет память
Скорее всего ты в обработчике таймера занимаешь память, но не освобождаешь, вот и утечка. Сам TTimer утечек памяти не делает.
Ответить с цитированием
  #18  
Старый 17.04.2014, 04:15
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Узнать текущую дату можно функцией Date. Сравнивать даты обычной операцией сравнения.Дата меняется раз в сутки.В каком смысле?TTimer - это достаточно гуманный способСкорее всего ты в обработчике таймера занимаешь память, но не освобождаешь, вот и утечка. Сам TTimer утечек памяти не делает.

ок, смотрите пример:
Код:
var
current_time: TDateTime;
change_time: string;
begin
current_time := time();
change_time := ('11:00:00');
if timetostr(current_time) = change_time then
showmessage('test');
end;

код чисто для примера. Вставляю код в таймер, ставлю интервал у таймера - минуту (60000), переменную change_time выставляю на 5 минут больше текущего времени, запускаю прогу, открываю диспетчер задач, смотрю на потребление памяти. При старте у меня 2944КБ потребление, через минуту 2952КБ и т.д. по возрастающей (+8 КБ). За сутки работы этого кода, размер потребления памяти по диспетчера задач увеличился с 3 до 9 МБ

Ставлю Timer1.Enabled := false; - потребление памяти не увеличивается ни на байт.

Где ошибка?

ЗЫ: Delphi 7 Enterprise (Build 4.453), Windows XP SP3.

ЗЫ2: Предполагаю что такую утечку дают функция timetostr, она выделяет память под значение, но не освобождает её... как переделать по другому не знаю.
Пробовал сделать переменную mytime := timetostr(current_time); и сравнивать mytime с change_time - но эффект тот же, потребление памяти увеличивается

Последний раз редактировалось Ahton, 17.04.2014 в 06:30.
Ответить с цитированием
  #19  
Старый 17.04.2014, 06:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Ahton
...Где ошибка? ...
В подходе к решению проблемы. Это всё можно заменить одной строкой
Код:
...
 if StrToTime('11:00:00') = Time then ShowMessage('test');
...
причём StrToTime применена чисто для наглядности, лучше время хранить в TDateTime потому как потом можно будет обращаться с этой переменной как с обычным числом - прибавлять и вычитать, хоть делить и умножать, посмотрите содержимое юнита DateUtils и сами увидите

З.Ы. Здесь надо учесть один нюанс - равенство возможно ни когда не будет выполнено, поскольку конкретное время бывает только раз за сутки, а таймер может в этот момент и не сработать, поэтому лучше выставить условие как >=

Последний раз редактировалось Alegun, 17.04.2014 в 06:59.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Ahton (17.04.2014)
  #20  
Старый 17.04.2014, 07:01
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

А есть какой то вариант сверки времени, чтобы было без утечек?
в моем случае мне нужно в определенное время запустить выполнение действия и программа должна месяцами висеть и делать одно и тоже действие в одно и то же время - я кроме как по таймеру, не умею сравнивать время
Ответить с цитированием
  #21  
Старый 17.04.2014, 07:06
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А где смысл в том чтоб держать резидента кругломесячно в памяти, проще запускать его из планировщика заданий, что-то делать необходимое и вырубаться после исполнения. Можно оформить небольшой утилитой, имхо
Ответить с цитированием
  #22  
Старый 17.04.2014, 07:29
Ahton Ahton вне форума
Прохожий
 
Регистрация: 05.01.2007
Сообщения: 38
Репутация: 10
По умолчанию

А если допустить что есть нужна в "резиденте" ?
Неужели делфи не может такую банальную вещь как сравнение времени и запуск в нужное время?
А если какой нибудь человек решит написать свой планировщик - сравнение же должно быть какое то, а получается что сравнение жрет память и планировщик будет с утечками памяти - просто пестня ))

может время сравнивать не как строку?
Ответить с цитированием
  #23  
Старый 17.04.2014, 08:13
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Ahton
...Неужели делфи не может такую банальную вещь как сравнение времени и запуск в нужное время?
А если какой нибудь человек решит написать свой планировщик - сравнение же должно быть какое то, а получается что сравнение жрет память и планировщик будет с утечками памяти - просто пестня ))
может время сравнивать не как строку?
Оффтоп:
Делфи может многое - она как топор, всё от в-руках-его-держащего зависит - кто-то кроме как дровишки для мангала порубить в выходные, а некоторые могут им и колоссы сваять, такие напр. как в Кижах в наследство нам достались шедевры деревяного зодчества...

Это так, к слову, а по теме - не используйте вар секцию в обработчике таймера, не выполняйте весь код в нём, лучше в отдельные функции и процедуры это дело оформить, поменьше сравнений аля присвоений, и утечек не будет - СР достаточно умна для этого, многое прощает, но всё же нужно прикидывать детали реализации самостоятельно, имхо. Нужна конкретика - пжлст, показывайте код, будем поглядеть
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:40.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025