#pas
if AutoStop >= 0 then dec(AutoStop);
f := AutoStop = 0;
_hi_OnEvent(_event_onTimer);
if f then begin
flag := 0;
OnStop;
end;
if flag > 0 then dec(flag);
Такая же штука и в MMTimer
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Вот кусок кода из Timer.pas:
Такая же штука и в MMTimer |
|||
карма: 10 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Assasin писал(а): Такая же штука и в MMTimerВ MMTimer я просто повторил то, что было в обычном таймере, не сильно вдаваясь в подробности работы. А для чего так сделано, надо спросить автора оригинального таймера ------------ Дoбавленo в 15.00: Assasin, а тебе не кажнтся, что если этого не сделать, то при AutoStop = 0 таймер сразу же остановиться, а так уйдет в отрицательные значения и в бесконечный цикл |
|||
карма: 22 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Убрал = из кода, все ок работает при любом режиме
|
|||
карма: 10 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Assasin писал(а): Убрал = из кода, все ок работает при любом режимеА вот не надо ля-ля. Только что проверил -- нифига он не входит в бесконечный цикл при AutoStop = 0. Да и по логике видно, что не будет работать. [offtop]Assasin, ты, наверное, переучился немного, отдохнуть бы надо, если простую логику понять не можешь[/offtop] |
|||
карма: 22 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Да, правда, пора на каникулы...
------------ Дoбавленo в 20.26: [offtop]А то эта извечная подготовка к ГИА...[/offtop] |
|||
карма: 10 |
|
Ответов: 1328
Рейтинг: 69
|
|||
а в чем отличие таймеров?
|
|||
карма: 2 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Konst писал(а): а в чем отличие таймеров?MMTimer не привязан к оконным событиям, поэтому может применяться в серверах и фоновых приложениях. Соответственно, он точнее, и разрешение у него не 10 msec (что и реально-то нет у стандартного таймера), а 1 msec Кладов писал(а): для своей работы не требует оконного дескриптора, и вместо отправки сообщений, напрямую вызывает пользовательский обработчик. Причем, вызов происходит всегда в чужом (системном) потоке команд. Т.е. не только не гарантируется, что событие будет срабатывать только, когда процесс ожидает сообщений, но напротив: почти наверняка будет происходить прерывание текущей операции, чтобы выполнить указанный обработчик.P.S. Настоятельно рекомендуется не применять в его очереди событий интерфейсные элементы, тк, наверняка, они нормально работать не будут |
|||
карма: 22 |
| ||
Голосовали: | Konst |
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
nesco писал(а): P.S. Настоятельно рекомендуется не применять в его очереди событий интерфейсные элементы, тк, наверняка, они нормально работать не будутвообще-то он выполняется в отдельном потоке и потому к нему применимы все ограничения, которые описаны для элемента Thread (об этом кстате говоря следовало написать у него в замечаниях) |
|||
карма: 27 |
| ||
Голосовали: | Konst |
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Dilma писал(а): об этом кстате говоря следовало написать у него в замечанияхДа, скорее всего, надо написать |
|||
карма: 22 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Хм, теперь новая задачка, вроде как поток (компонент Thread) нельзя остановить из самого себя методом doStop, а только doStopFlag, а вот с таймером что-то не очень понятно, останавливать останавливает, а запускать никак не хочет:
code_19842.txt |
|||
карма: 10 |
| ||
файлы: 1 | code_19842.txt [1.6KB] [137] |
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Assasin писал(а): из самого себя методом doStop, а только doStopFlagПочему же, можно и, как правило, так делается -- его можно остановить из главной очереди, использу событие onSyncExec |
|||
карма: 22 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
nesco писал(а): Почему же, можно и, как правило, так делается -- его можно остановить из главной очереди, использу событие onSyncExecХорошо, понятно, теперь вопрос, в схеме выше никак не избежишь того, что MMTimer опять не запускается, после того как остановлен |
|||
карма: 10 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Assasin, я нефига не понлял твою схему -- зачем ты перезапускашь таймер сразу после остановки, что это дает
|
|||
карма: 22 |
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
Это дает в игре возможность вывести сообщение о переходе на следующий уровень и приостановить события игры (особенно если игра на время), а затем заново запустить их
|
|||
карма: 10 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
карма: 22 |
| ||
файлы: 1 | code_19843.txt [887B] [170] |