Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2014, 22:40   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Получить текущий обратный отсчёт таймера

Доброго времени суток!
Можно ли как-нибудь подлезть к таймеру и получить оставшееся количество секунд до срабатывания? Или можно это сделать только так?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  sec, min: Integer;
begin
  dec(i);
  min := i div 60;
  sec := i mod 60;

  Label1.Caption := IntToStr(min) + ' минут ' + IntToStr(sec) + ' секунд';
  if i = 0 then i := 60;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2014, 22:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не понял. В обработчике таймера узнать сколько осталось до срабатывания? Так он уже сработал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.10.2014, 22:46   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно ли как-нибудь подлезть к таймеру и получить оставшееся количество секунд до срабатывания?
А зачем если не секрет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2014, 22:57   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем если не секрет?
Есть задача узнать сколько осталось до конца отсчёта.
Если простых путей нет, то придётся использовать код приведённый в первом посте.

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не понял. В обработчике таймера узнать сколько осталось до срабатывания? Так он уже сработал
Производить опрос таймера, например, по кнопке.

Последний раз редактировалось Stilet; 05.10.2014 в 09:49.
Shouldercannon вне форума Ответить с цитированием
Старый 05.10.2014, 01:10   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Храни время в глобальной переменной, высчитав его один раз, а сколько осталось - это разность этого времени и текущего времени в данный момент. юзать можно gettickcount(), например, или now().

Компонент TTimer здесь вообще ни при чём.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.10.2014, 01:23   #6
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Есть задача узнать сколько осталось до конца отсчёта.
Если простых путей нет, то придётся использовать код приведённый в первом посте.
Мягко говоря не совсем понятно кто что и зачем отсчитывает.
В рамках винды есть шикарная штука GetTickCount. Какие-то там миллисекунды себе считает и считает. Используя её, можно запомнить
начало некоего отсчета:
Код:
MyEventCountdownStart := GetTickCount()
Теперь достаточно просто узнать сколько прошло времени с начала отсчета:
Код:
Delta := GetTickCount - MyEventCountdownStart
Соответственно, если мы выбрали место, которое отслеживает это самое время, то можно генерировать и само событие:
Код:
if (MyEventCountdownEnabled) then
if (GetTickCount > MyEventCountdownStart + EVEN_START_DELAY) then begin
    EventCall(SomeParams);
    MyEventCountdownEnabled := False;
end;
А можно узнать сколько осталось до конца чего-нибудь:
Код:
if (GetTickCount <= MyEventCountdownStart + EVEN_START_DELAY) then begin
    Estimated := EVEN_START_DELAY - (GetTickCount - MyEventCountdownStart); 
end else begin
    Estimated := 0;
end;
Единственное, что вы должны обеспечить - это согласованность кода с самим собой, его когеренетность. У вас не должно быть путешествий во времени. Один из механизмов обеспечения: строгая фиксация времени в пределах вычислительного кадра\фрейма. То есть на всю программу только в одном месте записывается CURTIME := GetTickCount. Остальные части кода считают CURTIME константой (теперь вы должны сходу найти выше грубейшую ошибку).
StriderX вне форума Ответить с цитированием
Старый 05.10.2014, 01:25   #7
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Храни время в глобальной переменной, высчитав его один раз, а сколько осталось - это разность этого времени и текущего времени в данный момент. юзать можно gettickcount(), например, или now().

Компонент TTimer здесь вообще ни при чём.
У программиста была проблема, потом он решил использовать числа с плавающей точкой и у него теперь 1.99999999999999999997 проблемы %)
Now может сильно расстраивать неискушенных людей, особенно если какая-нибудь зараза перещёлкнет сопроцессор в режим одинарной точности. В этом смысле лучше компоненты времени получать раздельно - GetTime\GetDate, или что там было =-)
StriderX вне форума Ответить с цитированием
Старый 05.10.2014, 10:44   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Ещё точнее. Есть таймер с интервалом 5 минут. Через 5 минут происходит какое-то действие. Хочу подлезть к этому таймеру и узнать сколько ему осталось отсчитывать до 5 минут.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 300000;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Something
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Сколько осталось до конца отсчёта или сколько натикал Timer1 и выполнения действия');
end;
Вывод: Таймер так не умеет, он только уведомляет. GetTickCount в помощь

Последний раз редактировалось Shouldercannon; 05.10.2014 в 11:03.
Shouldercannon вне форума Ответить с цитированием
Старый 06.10.2014, 02:05   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Ещё точнее. Есть таймер с интервалом 5 минут. Через 5 минут происходит какое-то действие. Хочу подлезть к этому таймеру и узнать сколько ему осталось отсчитывать до 5 минут.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 300000;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Something
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Сколько осталось до конца отсчёта или сколько натикал Timer1 и выполнения действия');
end;
Вывод: Таймер так не умеет, он только уведомляет. GetTickCount в помощь
Точнее TTimer так не умеет. И ничего удивительного. Дельфийский компонент TTimer всего лишь "пустышка". Оболочка над таймером Windows. Но и к таймеру Windows так просто не подлезешь. Вот в драйвере нулевого кольца - пожалуйста. Получишь сколько осталось времени до сработки таймера.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить текущий url браузера Safari igrok111 Общие вопросы Delphi 0 25.06.2013 16:07
Обратный отсчёт времени Che Guevara JavaScript, Ajax 2 05.05.2011 14:03
Обратный отсчёт в часах минутах и секундах Shouldercannon Общие вопросы Delphi 18 06.08.2010 21:53
Как получить текущий век в С# ? PCmaster Общие вопросы .NET 4 20.04.2010 21:45
Обратный отсчёт mager PHP 3 01.04.2009 17:16