Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение процедуры в заданное время, TTimer + flag? 
:(
    Опции темы
Unregistered
Дата 15.3.2004, 05:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нужно выполнять процедуру в заданное время. Первое что приходит в голову - поставить на Timer. установить интервал 50 мс . когда наступит время - выполнить процедуру. установить флажок, что процедура выполнена. затем через минуту снять флажок. Вопрос: есть ли более эффективный способ? Например, запускать вместо таймера отдельный поток? Чтоб можно было гарантировать выполнение процедуры? Спасибо.
  Вверх
cot
Дата 15.3.2004, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 4.6.2003

Репутация: нет
Всего: нет



Можно и в отдельный поток. Но мне думается все равно без Timer-а не обойтись. Или в цикле постоянно сканировать системное время.
PM MAIL   Вверх
<Spawn>
Дата 15.3.2004, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



если процедура выполняется длительное время и период через который она будет вызываться мал, то лучше использовать поток в комбинации со Sleep, так как с таймером может произойти следущая картина - таймер запускает процедуру, она выполняется, но не успев закончися, таймер запускает ее снова и получишь зависание своей проги. Было у меня как то такое - отдельный поток был лучшим выходом.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Guest
Дата 16.3.2004, 02:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А я всегда думал, что пока процедура таймера не отработает, то по новой не запуститься. У меня есть программы с длительным выполнением процедуры (запись в базу по сети) на OnTimer и ни разу проблем не было. А можно как-то использовать WaitForSingleObject? В асинхронном варианте это было бы неплохое решение.
  Вверх
<Spawn>
Дата 16.3.2004, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



По моему в таймере ты не как не остановишь следущий его вызов. Насколько я помню, сообщение WM_TIMER даже в очередь не ставиться, а прямиком доставляется обработчику.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Unregistered
Дата 16.3.2004, 07:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В SetTimer передается Handle окна (если пользовать VCL компонент). Наверное очередь таки есть?
  Вверх
Петрович
Дата 16.3.2004, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
По моему в таймере ты не как не остановишь следущий его вызов. Насколько я помню, сообщение WM_TIMER даже в очередь не ставиться, а прямиком доставляется обработчику.

Ну неправда.
А повторный вызов обычно случается когда во время длительной обработки дергается Application.ProcessMessage
Добавлено @ 08:51
Кстати, если для топика использовать таймер, то не надо дергать его каждые 50мс. Достаточно сначала определить разницу между требуемым временем и текущим, и "зарядить" таймер именно на этот интервал.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
X-Vlad
Дата 16.3.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



я реализовал подобное так:
на ontimer повесил процедуру, в начале процедуры поставил timer1.enabled:=false; а в конце процедуры опять запускал таймер timer1.enabled:=true; Ну и конечно контролировал что-бы процедура незапустилась опять, если например она выполнилась меньше чем за одну минуту.

Вроди нормально работает...


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 17.3.2004, 02:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











По поводу интервала, это верно отчасти. Представляю как будет выглядеть реализация интерфейса пользователя... Ну в любом случае, таймер для такого случая не есть гуд.

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.