Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Not enough timers available!   Найти похожие ветки 

 
savyhinst ©   (2008-06-23 19:26) [0]

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

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


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


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


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


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

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


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


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


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

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

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

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


 
savyhinst ©   (2008-06-23 19:43) [4]

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


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

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


 
Anatoly Podgoretsky ©   (2008-06-23 20:03) [6]

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

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


 
savyhinst ©   (2008-06-23 20:09) [7]

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


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


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


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


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

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


 
Anatoly Podgoretsky ©   (2008-06-23 20:19) [10]

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


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


> tmr.Enabled:=flase;

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

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


 
savyhinst ©   (2008-06-23 20:48) [12]

хмхм. Фрагмент кода не получится - код слишком большой...
Но в кратце - так:
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:56) [13]

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

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


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


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


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


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

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


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


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


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


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


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


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

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


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


> почему так?


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


 
HINST   (2008-06-23 21:23) [19]

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


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

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

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

И все !



Страницы: 1 вся ветка

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
2-1214322012
Галинка
2008-06-24 19:40
2008.07.27
сравнить два файла?


11-1192180159
Nikfel
2007-10-12 13:09
2008.07.27
Как определить в какую сторону крутится ролик мыши.


6-1191213910
VitGun
2007-10-01 08:45
2008.07.27
Блокировка диалоговых окон в TWebBrowser


2-1214307469
uno-84
2008-06-24 15:37
2008.07.27
Ссылка в тексте


2-1214237843
cr@nk
2008-06-23 20:17
2008.07.27
Помогите с условием входения в заштрих. область