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

Вниз

История. MMTimer!!!   Найти похожие ветки 

 
Barloggg   (2006-01-23 10:16) [0]

Откуда мне было знать, что он многозадачный? предупреждать надо... :(
Короче история такова: про ММтимер я знал только то, что он типа более точный. ну и повесил на его тик процедуру отрисовки динамически генерируемого битмапа, который может быть большим, а может быть и маленьким. как получится.
и как начало все глючить...но не сразу, а когда битмап стал большим...
я даже до ручки дошел... во всех процедурах в проге лог начал вести... чуть ли не построчно. вот не доходит процедура до конца и все тут... начинается другая...
откуда же мне было знать, что этот самый ММтимер когда наступает время берет и запускает еще одну копию этой процедуры? которая начинает модифицировать уже начавшийся изменяться битмап и все бабахает.
и пошло в лог файле наслоение одной процедуры на другую... а завершения процедур все нету и нету...

в общем времени и нервов потратил... потом долго обалдевал, когда нашел таки решение и заменил MMTimer на обычный Timer. а потом еще для верности флажок поставил :)

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


 
Thaddy   (2006-01-23 11:22) [1]

The MMTimer is a very accurate timer that uses its own thread and is a kernel process with very high precedence. That"s why you can"t use its timer events/callback to process long routines, it can even stop your machine from responding!:
As stated in the WIN32 API documentation, you should only use it to process short routines. Otherwise a better solution is to use a real thread for multitasking.
See my managed threads package on my website. Within the thread you can use the performance counter to do precise timing.


 
ECM ©   (2006-01-23 11:41) [2]

Да уж... (тоже наступал на эти грабли ... даже несколько раз (склероз наверное))   :))
Я думаю (ИМХО) неправильно было объединять в MCK два таймера (обычный и ММ) в одном компоненте. Слишком у них разное поведение...  

> Откуда мне было знать, что он многозадачный? предупреждать
> надо... :(


MSDN:
timeSetEvent
The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread

Тем более в MMTimer есть еще куча полезностей - вместо callback можно управлять событием (Set или Pulse). И однозначно надо добавить в KOL:

     fHandle := timeSetEvent( Interval, Resolution, MMTimerCallback, DWORD( @ Self ),
             Integer( Periodic ) or TIME_CALLBACK_FUNCTION or TIME_KILL_SYNCHRONOUS )

Creating an event with the TIME_KILL_SYNCHRONOUS and the TIME_CALLBACK_FUNCTION flag prevents the event from occurring after the timeKillEvent function is called.

Тогда в Вашем случае (ИМХО) можно было бы использовать его в режиме Periodic = FALSE и по окончании callback-процедуры Запускать таймер снова.


 
Vladimir Kladov   (2006-01-23 16:24) [3]

я объединил, потому что иногда многопоточность здесь особых неприятностей не дает, зато есть возможность вместо бросания на форму другого компонента и перенастройки кода просто включить галочку и быстро посмотреть что получится. Надо было в MCK и bitbtn с обычным button объединить, чтобы тоже иметь возможность легкого перехода от отдного к другому в проекте.


 
Barloggg   (2006-01-24 10:06) [4]

кстати я не пользовался МСК компонентом. а сразу закатил newMMtimer. убрал две буквы здесь, две буквы там и стал таймер обычным.
хмм... в наборе DelphiX есть таймер, который работает как обычный, но является мультимедийным. В его OnTimer еще дополнительно передается некий LagCount то есть число срабатываний таймера когда программа была занята. я прикинул и получилось, что там разом работает два таймера один обычный, который генерирует onTimer а второй мультимедийный, который лишь считает этот самый LagCount.
Лично я был бы очень рад если бы обычный таймер работал также, то есть в конструкторе создавал сразу два и выдавал бы еще и lagcount. Это крайне полезно при анимации. на каком проце не запусти везде будет одинаково.

и вообще неплохо бы претворить в жизнь принцип минимального кол-ва пользовательских компонент. короче все запихать в стандартный набор. а то эта необходимость ребилда... в результате у меня стоит только стандартный набор МСК и все.
кстати ListView хорошо заменяет Stringgrid, пока дело не доходит до записи значений в сетку...


 
SPeller ©   (2006-01-24 10:42) [5]

Barloggg   (24.01.06 10:06) [4]
пока дело не доходит до записи значений в сетку

Это точно :))



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

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

Наверх




Память: 0.48 MB
Время: 0.079 c
2-1162113417
Серый
2006-10-29 12:16
2006.11.12
Блокировка кнопки


2-1161624830
i-am-vladko
2006-10-23 21:33
2006.11.12
буг на Ресайзе


2-1161929161
Mishenka
2006-10-27 10:06
2006.11.12
Как в ячейке таблицы указать горизонтальное выравнивание?


15-1161242589
Александр Иванов
2006-10-19 11:23
2006.11.12
Америка хочет контролировать все запуски в космос?


15-1161807382
TButton
2006-10-26 00:16
2006.11.12
мастерам php =)