Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#1: 2010-02-11 14:42:43 ЛС | профиль | цитата
Вот кусок кода из Timer.pas:
#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);
Вопрос, зачем лишний знак "=" в Autostop >= 0 then dec(autostop);
Такая же штука и в MMTimer
карма: 10
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2010-02-11 14:56:33 ЛС | профиль | цитата
Assasin писал(а):
Такая же штука и в MMTimer

В MMTimer я просто повторил то, что было в обычном таймере, не сильно вдаваясь в подробности работы. А для чего так сделано, надо спросить автора оригинального таймера
------------ Дoбавленo в 15.00:
Assasin, а тебе не кажнтся, что если этого не сделать, то при AutoStop = 0 таймер сразу же остановиться, а так уйдет в отрицательные значения и в бесконечный цикл
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#3: 2010-02-11 20:00:36 ЛС | профиль | цитата
Убрал = из кода, все ок работает при любом режиме
карма: 10
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2010-02-11 20:11:56 ЛС | профиль | цитата
Assasin писал(а):
Убрал = из кода, все ок работает при любом режиме

А вот не надо ля-ля. Только что проверил -- нифига он не входит в бесконечный цикл при AutoStop = 0. Да и по логике видно, что не будет работать.

[offtop]Assasin, ты, наверное, переучился немного, отдохнуть бы надо, если простую логику понять не можешь[/offtop]
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#5: 2010-02-11 20:25:34 ЛС | профиль | цитата
Да, правда, пора на каникулы...
------------ Дoбавленo в 20.26:
[offtop]А то эта извечная подготовка к ГИА...[/offtop]
карма: 10
0
Ответов: 1328
Рейтинг: 69
#6: 2010-02-11 22:23:46 ЛС | профиль | цитата
а в чем отличие таймеров?
карма: 2

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#7: 2010-02-11 22:53:14 ЛС | профиль | цитата
Konst писал(а):
а в чем отличие таймеров?

MMTimer не привязан к оконным событиям, поэтому может применяться в серверах и фоновых приложениях. Соответственно, он точнее, и разрешение у него не 10 msec (что и реально-то нет у стандартного таймера), а 1 msec

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


P.S. Настоятельно рекомендуется не применять в его очереди событий интерфейсные элементы, тк, наверняка, они нормально работать не будут
карма: 22

1
Голосовали:Konst
Администрация
Ответов: 15295
Рейтинг: 1519
#8: 2010-02-11 23:01:22 ЛС | профиль | цитата
nesco писал(а):
P.S. Настоятельно рекомендуется не применять в его очереди событий интерфейсные элементы, тк, наверняка, они нормально работать не будут

вообще-то он выполняется в отдельном потоке и потому к нему применимы все ограничения, которые описаны для элемента Thread (об этом кстате говоря следовало написать у него в замечаниях)
карма: 27
1
Голосовали:Konst
Разработчик
Ответов: 26163
Рейтинг: 2127
#9: 2010-02-11 23:16:34 ЛС | профиль | цитата
Dilma писал(а):
об этом кстате говоря следовало написать у него в замечаниях

Да, скорее всего, надо написать
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#10: 2010-08-05 19:06:11 ЛС | профиль | цитата
Хм, теперь новая задачка, вроде как поток (компонент Thread) нельзя остановить из самого себя методом doStop, а только doStopFlag, а вот с таймером что-то не очень понятно, останавливать останавливает, а запускать никак не хочет:
code_19842.txt
карма: 10
0
файлы: 1code_19842.txt [1.6KB] [137]
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2010-08-05 19:14:21 ЛС | профиль | цитата
Assasin писал(а):
из самого себя методом doStop, а только doStopFlag

Почему же, можно и, как правило, так делается -- его можно остановить из главной очереди, использу событие onSyncExec
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#12: 2010-08-05 19:20:05 ЛС | профиль | цитата
nesco писал(а):
Почему же, можно и, как правило, так делается -- его можно остановить из главной очереди, использу событие onSyncExec

Хорошо, понятно, теперь вопрос, в схеме выше никак не избежишь того, что MMTimer опять не запускается, после того как остановлен
карма: 10
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#13: 2010-08-05 19:20:19 ЛС | профиль | цитата
Assasin, я нефига не понлял твою схему -- зачем ты перезапускашь таймер сразу после остановки, что это дает
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#14: 2010-08-05 19:21:14 ЛС | профиль | цитата
Это дает в игре возможность вывести сообщение о переходе на следующий уровень и приостановить события игры (особенно если игра на время), а затем заново запустить их
карма: 10
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#15: 2010-08-05 19:22:26 ЛС | профиль | цитата
А вот так работает

code_19843.txt
карма: 22

0
файлы: 1code_19843.txt [887B] [170]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)