![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> пытаюсь в начале процедуры приостановить таймер (на всякий
> случай)
И какой же такой "всякий случай", по-твоему, может приключиться ?