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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2006, 19:09   #21
Flash_
Пользователь
 
Аватар для Flash_
 
Регистрация: 19.12.2006
Сообщений: 91
По умолчанию

Цитата:
Сообщение от PikeIt Посмотреть сообщение
Делаю игрушку(Ракетой надо взлететь с одного космодромчика на другой(учитывая скорость, угол, точность приземления, время, колво топлива(мож еще что дабавлю)))
У меня в ней работают 2 таймера(либо 1 либо другой)
и вот думаю мне проверку точности приземления, полета за границу уровня... вставать в каждый из таймеров или лучше создать 3 таймер который будет все это проверять? посоветуйте
Третий таймер, скорее всего, проще сделать, да и надежней.. Но возможно и без него обойтись можно - тяжело говорить не зная кода. =/
Flash_ вне форума Ответить с цитированием
Старый 30.12.2006, 19:44   #22
PikeIt
НачПрог
 
Регистрация: 23.12.2006
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Flash_ Посмотреть сообщение
Третий таймер, скорее всего, проще сделать, да и надежней.. Но возможно и без него обойтись можно - тяжело говорить не зная кода. =/
Пасиб! решил зделать 3 таймер. Там полно в нем чего надо писать, чтоб не копировать одно и тоже в 2 таймера
program qwe;
PikeIt вне форума Ответить с цитированием
Старый 30.12.2006, 20:19   #23
Flash_
Пользователь
 
Аватар для Flash_
 
Регистрация: 19.12.2006
Сообщений: 91
По умолчанию

Цитата:
Сообщение от PikeIt Посмотреть сообщение
Пасиб! решил зделать 3 таймер. Там полно в нем чего надо писать, чтоб не копировать одно и тоже в 2 таймера
Да не за что спасибо говорить!
Flash_ вне форума Ответить с цитированием
Старый 11.01.2007, 12:55   #24
Alex_soldier
Пользователь
 
Аватар для Alex_soldier
 
Регистрация: 11.01.2007
Сообщений: 12
По умолчанию

А не проще ли было обойтись 1 таймером?
Просто засечь моменты начала каждого события, и каждый такт обновлять состояния (с проверкой того, что отсчет уже запущен).
Alex_soldier вне форума Ответить с цитированием
Старый 13.01.2007, 13:54   #25
Mihail
 
Регистрация: 12.01.2007
Сообщений: 6
По умолчанию

Ууу, б**, что я сам не додумался? Можно ведь кучу таймеров навставлять и разделить обязанности. Так и работать быстрей должно, нежели все в одном. Правильно думаю?

Последний раз редактировалось Mihail; 13.01.2007 в 13:56. Причина: опечатка
Mihail вне форума Ответить с цитированием
Старый 13.01.2007, 14:09   #26
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Таймер сам по себе тормозит систему... Думаю можно всё в одном, чем в нескольких.
Вообще за место таймера можно и пустое событие использовать в цикле. Если надо напишу.
zetrix вне форума Ответить с цитированием
Старый 13.01.2007, 14:13   #27
Mihail
 
Регистрация: 12.01.2007
Сообщений: 6
По умолчанию

Пустое событие?? Нука пиши.
Mihail вне форума Ответить с цитированием
Старый 13.01.2007, 14:21   #28
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Код:
Procedure MyTimer;
var whevent:thandle;
begin
whevent:=createevent(nil,true,false,'et');
while(true)do //вместо true - условие выхода
  begin
  WaitForSingleobject(whevent,500); //500 - интервал (в мс)
  //вставляем то, что должно повторятся
  application.processmessages; //дадим системе время обработать другие события 
  end;
end;
проверьте через таймер и через эту процедуру (загруженность проца).
Лично я нашёл применение этому в трояне: через 500мс проверяет наличие сообщений от "командного центра"
zetrix вне форума Ответить с цитированием
Старый 13.01.2007, 16:03   #29
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
Сообщение

Исходный код компонента TTimer находится в файле ExtCtrls.pas. Он невелик, очень прост и может быть рекомендован как иллюстрация на тему "как писать простые компоненты".

Основой класса является функция UpdateTimer. Она вызывается при каждом заметном событии - например, при изменении свойства Enabled - и настраивает системный таймер так, чтобы он работал (или не работал) в соответствии с изменившимися настройками. Вот ее текст:
Код:
procedure TTimer.UpdateTimer ;
begin
  KillTimer ( FWindowHandle, 1 ) ;
  if ( FInterval <> 0 ) and FEnabled and Assigned ( FOnTimer ) then
    if SetTimer ( FWindowHandle, 1, FInterval, nil ) = 0 then
      raise EOutOfResources.Create ( SNoTimers ) ;
end ;
Главное, что следует из этого текста - компонент TTimer реализован с помощью функций SetTimer/KillTimer Win API и, следовательно, ограничен возможностями и особенностями этих функций.

Основная особенность созданных таким способом таймеров - работа через очередь сообщений Windows. Таймерное событие происходит тогда и только тогда, когда приложение обрабатывает очередь сообщений; для приложение срабатывание таймера выглядит как приход сообщения WM_TIMER. Таким образом, точность и равномерность таймеров весьма условны - если, скажем, приложение выполнит SQL-запрос (что на пять секунд займет основной поток), таймер, настроенный срабатывать десять раз в секунду, в течение этого времени не сработает ни разу. По этой же причине таймер не сработает во время паузы, достигнутой с помощью функции Sleep. По этой же причине таймер не сработает во время ожидания, организованного с помощью функции WaitForSingleObject. И так далее в том же духе. С другой стороны, таймер вполне может сработать при вызове подпрограммы Application.ProcessMessages, при открытии модальной формы (внутри метода ShowModal) и так далее - везде, где происходит обработка очереди сообщений.

Существенный момент - "несработавшие вызовы таймера" не накапливаются в системе. В случае, если приложение несколько секунд не обрабатывало очередь сообщений - таймер, настроенный срабатывать десять раз в секунду, сработает один раз при следующем обращении к очереди, и в следующий раз - не раньше, чем через 1/10 секунды (но возможно - куда позже, нежели через 1/10).

Можно заметить, что в подпрограмме UpdateTimer предусмотрен вариант несоздания таймера из-за недостатка ресурсов. В связи с чем возникает вопрос: сколько таймеров может использовать приложение? Простой эксперимент показывает следующее: в случае, если программа создает 10.000 таймеров, система (Win2000) ощутимо напрягается, но таймеры создает. Таким образом, можно считать, что реально достижимых ограничений на количество таймеров сейчас нет. При повторении этого эксперимента следует учесть приведенный выше код: функция UpdateTimer создает только те таймеры, которые будут реально работать - иначе говоря, для корректного эксперимента необходимо установить свойства Enabled, Interval и OnTimer.
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 13.01.2007, 16:36   #30
Mihail
 
Регистрация: 12.01.2007
Сообщений: 6
По умолчанию

Сейчас наворочу чего нибудь. Спасибо.
Mihail вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер в С# kommunist Общие вопросы .NET 3 02.06.2008 12:11
таймер Романнн Общие вопросы Delphi 19 19.12.2007 15:33
таймер darkcoder Общие вопросы Delphi 5 06.12.2007 06:14
Таймер Stanislav Общие вопросы Delphi 3 26.11.2007 06:52
Таймер Blondinko Помощь студентам 6 23.10.2007 10:35