Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Not enough timers available! [D7, XP]


savyhinst ©   (2008-06-23 19:26:00) 

Здраствуйте!
Подскажите пожалуйста, почему, когда я пытаюсь в начале процедуры приостановить таймер (на всякий случай), а в конце - продолжить
tmr.Enabled:=flase;
... ... ...
tmr.Enabled:=true;

возникает загадочная ошибка Not enough timers available и что она означает.
Спасибо за внимание.


Сергей М.   (2008-06-23 21:26:00) [1]

Ты вот скажи, за каким лешим тебе понадобились два таймера ?

При создании (или инициализации) компонента создаешь таймер, при уничтожении (или деинициализации) уничтожаешь. При начале анимации разрешаешь его, при завершении анимации запрещаешь. Таймер тикает с нужной частотой, например, 15 Гц (вполне достаточно для этой игры). При каждом тике строишь игровую сцену и тут же рендеришь ее на канву.

И все !


HINST   (2008-06-23 21:23:00) [2]

почему включение работавшего таймера приводит к 'нехватке таймеров' ?


Сергей М.   (2008-06-23 21:18:00) [3]


> почему так?


Что "почему" ?


HINST   (2008-06-23 21:14:00) [4]

ХМХМ. А почему так?? Не понятно.


Сергей М.   (2008-06-23 21:13:00) [5]


> второй таймер разрушает себя каждый раз, как только закончена
> анимация


Значит не разрушает.
Да и нафих нужен этот второй таймер, если можно вполне обойтись одним-единственным ?


> ошибка возникает не через некоторое время, когда таймеров
> уже куча, а в процедуре rotate


Я даже скажу в какой конкретно строчке - tmrAnim.enabled:=true


HINST   (2008-06-23 21:07:00) [6]

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


Сергей М.   (2008-06-23 20:57:00) [7]


> при вызове обработчика FallAnimation


OnFa iling, имелось виду.


Сергей М.   (2008-06-23 20:56:00) [8]

Ну и где тут всего дватаймера ?

Их тут туева хуча - всякий раз при вызове обработчика FallAnimation в теле  метода FallAnimation создается очередной новый таймер.


savyhinst   (2008-06-23 20:48:00) [9]

хмхм. Фрагмент кода не получится - код слишком большой...
Но в кратце - так:
type tmy=class(TComponent)
private
 tmr:TTimer;
 tmrAnim:TTimer;
 map:TMap;
public
 procedure Init;  //для экономии места код прямотут
 begin
   tmr:=TTimer.Create;
   tmr.OnTimer:=OnFalling; //
 end;

 procedure OnFalling(sender:TObject);
 begin
   if Falled(map)
     then MakeFalled
     else FallAnimation;
   FallFigures(map);
 end;

 procedure FallAnimation
 begin
   tmrAnim:=TTimer.Create;
   tmrAnim.OnTimer:=OnAnimTimer;
 end;

 procedure OnAnimTimer(sender:TObject);
 begin
   //тут обращаемся к map...
 end;
 
 procedure Rotate; //делается нан нажатие кнопки
 begin
   tmrAnim.enabled:=false;
   tmr.enabled:=false;
   //тут обращаемся к map...
   tmrAnim.enabled:=true;
   tmrAnim.enabled:=true;
 end;
end;

ухх... Написал, кажется


Правильный-Вася   (2008-06-23 20:33:00) [10]


> tmr.Enabled:= flase;

это что за зверь?

явно таймер создается налету внутри процедуры срабатывания другого таймера


Anatoly Podgoretsky   (2008-06-23 20:19:00) [11]

А ты приведи точный код из твоей программы, ну или хотя бы все зависимые определения.


Сергей М.   (2008-06-23 20:17:00) [12]

Да и слишком много это - два таймерных компонента.
Достаточно одного.


Сергей М.   (2008-06-23 20:16:00) [13]


> у меня их всего два


Значит не два, раз ошибка.


savyhinst   (2008-06-23 20:09:00) [14]

хм. Но у меня их всего два!


Anatoly Podgoretsky   (2008-06-23 20:03:00) [15]

> savyhinst  (23.06.2008 19:43:04)  [4]

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


Сергей М.   (2008-06-23 19:47:00) [16]

Дофига таймеров ты насоздавал, потому и ошибка)


savyhinst   (2008-06-23 19:43:00) [17]

Хмхм. А Что Значит Таинственная 0шибка??


Сергей М.   (2008-06-23 19:41:00) [18]


> таймер, по моему, может попробовать сдвинуть её вниз на
> одну клетку


Таймер сам по себе ничего не "двигает", у таймера совершено иные задачи - он "тикает".

Эти самые "тики", в конечном итоге, определенным образом превращаются в оконные сообщения WM_TIMER, выборка и обработка которых превращается в вызов и исполнение обработчика события TTimer.OnTimer.

В каждый момент времени в очереди оконных сообщений может находиться не более одного сообщения WM_TIMER.

Текущий обработчик события OnTimer не может быть прерван обработкой такого же или иного события, если ты явно или неявно не предполагаешь такой логики. Явное предположение - это, например, явный вызов Application.ProcessMessages в теле обработчика OnTimer.


savyhinst   (2008-06-23 19:30:00) [19]

Я делаю усовершенствованый тетрис. То есть, для начала, обычный. И во время переворачивания фигурки таймер, по моему, может попробовать сдвинуть её вниз на одну клетку. А это может быть причиной глюкофф моей проги.


Сергей М.   (2008-06-23 19:27:00) [20]


> пытаюсь в начале процедуры приостановить таймер (на всякий
> случай)


И какой же такой "всякий случай", по-твоему,  может приключиться ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо