Форум: "KOL";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизИстория. 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 вся ветка
Форум: "KOL";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.047 c