Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c