![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с VCL компонентами при установке таймера timeSetEvent [D7, WinXP]
Yuri Btr © (2004-09-25 20:10:00)Ув. мастера, хотелось бы обсудить вопрос доступа к VCL компонентам из callback функции мультимедийного таймера timeSetEvent. В MSDN написано, что этот таймер создается в собственном потоке. Я использую callback функцию для обновления свойств неких объектов. При этом передавая в качестве dwUser параметр DWORD(Self). При использовании таймера в юните формы, я могу callback ф-ию определить так:
procedure OnTimer(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall;
var
Form:TForm1;
begin
Form:=TForm1(dwUser);
with Form
do
begin
//здесь идут вызовы процедур и функций Form1
end;
end;
так вот, при вызове процедур и функций Form1 в некоторых из
них может случиться "зависание" компонента, к свойствам которого я обращаюсь.
Например я в callback ф-ии добавляю в ListBox всего одну строку (виснет ListBox), или делаю ClientSocket1.Open (происходит OnLookup, OnConnecting и нет ни OnConnect ни OnError
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1096115383&n=4)
Как правильно нужно использовать данный таймер? Нужно ли и где вызывать Sinchronize?
Заранее спасибо.
PGM_X (2004-09-27 00:01:00) [1][Yuri Btr] Но мне нужен пример как на практике это реализовать.
Варианты:
- Не использовать VCL
- Использовать сообщения или события, а не напрямую писать код в вызове OnTimer.
Yuri Btr (2004-09-26 21:59:00) [2]Всем спасибо за ответы, которые я и так знал ;)
Но мне нужен пример как на практике это реализовать.
А то знаете ли я сомневаюсь что дядька Рихтер писал про обращения к VCL
GanibalLector (2004-09-26 00:38:00) [3]Вам бы дядьку Рихтера найти.Там у него все описано!!!И особенно синхронизация,что так необходимо Вам.
PGM_X (2004-09-25 23:51:00) [4]"этот таймер создается в собственном потоке" вот и ответ. VCL не является потоконезависимой. Нельзя (не рекомендуется и не гарантируется работоспособность) вызывать функции VCL без специалной защиты (см. например комментарии к TThread).
Yuri Btr (2004-09-25 20:13:00) [5]Забыл добавить тот жесамый код прекрасно работает если заменить timeSetEvent на Timer из VCL библиотеки.