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

Вниз

Работа со свойствами VCL-компонентов из доп. потоков.   Найти похожие ветки 

 
SergP.   (2005-10-04 14:50) [0]

Делаю сабж. Но не всегда хорошо получается.
Например если меняю кепшен у формы, то он вообще становится пустым пока с окном ничего не сделать ( типа свернуть-развернуть или т.п.)
Если нужно делать сабж, то как правильно поступать?
Переносить в основной поток с помощью PostMessage, или можно попроще?


 
MBo ©   (2005-10-04 14:54) [1]

ну самое простое - как и полагается, Synchronize использовать


 
Digitman ©   (2005-10-04 14:54) [2]


> Например если меняю кепшен у формы


а наче как в осн.потоке это делать недопустимо !


 
Андрей Жук ©   (2005-10-04 14:59) [3]

А может лучше через сообщения менять свойства? Проще будет.


 
jack128 ©   (2005-10-04 15:48) [4]

Андрей Жук ©   (04.10.05 14:59) [3]
А может лучше через сообщения менять свойства? Проще будет.

есть один шанс на 10000 наткнуться на ошибку в получении хендла..   Гарантию даст только синхранизация самой процедуры посылки сообщения.


 
y-soft ©   (2005-10-04 15:50) [5]

>jack128 ©   (04.10.05 15:48) [4]

есть один шанс на 10000 наткнуться на ошибку в получении хендла..   Гарантию даст только синхранизация самой процедуры посылки сообщения

Если можно, то подробнее, пожалуйста... А заодно посмотрите, как реализован Sinchronize в D7...


 
begin...end ©   (2005-10-04 15:51) [6]

> jack128 ©   (04.10.05 15:48) [4]

О каком получении хэндла идёт речь?


 
jack128 ©   (2005-10-04 15:55) [7]

begin...end ©   (04.10.05 15:51) [6]
о самом обычном. О свойстве TWinControl.Handle
К тому же нужно иметь в виду, что иногда эти сообщения вообще могут не дойти до адресата.


 
begin...end ©   (2005-10-04 15:57) [8]

> jack128 ©   (04.10.05 15:55) [7]
> о самом обычном. О свойстве TWinControl.Handle

Хэндл можно передавать потоку как параметр его функции. Разве нет?


 
jack128 ©   (2005-10-04 16:01) [9]

begin...end ©   (04.10.05 15:57) [8]
Хэндл можно передавать потоку как параметр его функции. Разве нет?


Можно. Но хендл WinControl"а имеет свойство меняться..


 
y-soft ©   (2005-10-04 16:02) [10]

>jack128 ©   (04.10.05 15:55) [7]

К тому же нужно иметь в виду, что иногда эти сообщения вообще могут не дойти до адресата

Причина использования синхронных вызовов совсем иная - они гарантируют получение вызывающим потоком результата вызова и не более того. Зато привносят побочные эффекты - на время выполнения синхронного вызова:

1. Тормозится вызывающий поток
2. Тормозится очередь сообщений вызываемого потока
3. Тормозятся все потоки, которые послали вызываемому потоку синхронный выхов чуть позже вызывающего потока

В 99% случаев возвращаемый результат вообще не нужен, зато побочные эффекты зачастую вредны...

Так что исключительное использование синхронных вызовов не более чем предрассудок...

P.S. Вы все-таки гляньте в исходники TThread, как он реализован в D7, и сравните с реализацией в ранних версиях Delphi...


 
Leonid Troyanovsky ©   (2005-10-04 16:02) [11]


> begin...end ©   (04.10.05 15:57) [8]
> > о самом обычном. О свойстве TWinControl.Handle

> Хэндл можно передавать потоку как параметр его функции.


Возможно, что имелась ввиду возможное RecreateWnd.

--
Regards, LVT.


 
jack128 ©   (2005-10-04 16:03) [12]

begin...end © (04.10.05 15:57) [8]
Хэндл можно передавать потоку как параметр его функции. Разве нет?

Можно. Но хендл WinControl"а имеет свойство меняться..


 
y-soft ©   (2005-10-04 16:06) [13]

>jack128 ©   (04.10.05 16:01) [9]

хендл WinControl"а имеет свойство меняться

Для Delphi это к сожалению верно из-за пресловутого RecreateWnd. Но маловероятно


 
Leonid Troyanovsky ©   (2005-10-04 16:08) [14]


> y-soft ©   (04.10.05 16:02) [10]

> 2. Тормозится очередь сообщений вызываемого потока


Очередь - это всего лишь некая структура, она, скажем,
кхм.. статичная.

Кстати, у потока этих очередей - не одна.
Пора освежиться, у Рихтера.

--
Regards, LVT.


 
y-soft ©   (2005-10-04 16:10) [15]

>Leonid Troyanovsky ©   (04.10.05 16:08) [14]

Кстати, у потока этих очередей - не одна.
Пора освежиться, у Рихтера.


Там, кстати, и освежался... Если помните, то очередь синхронных сообщений имеет приоритет перед очередью асинхронных...


 
jack128 ©   (2005-10-04 16:12) [16]

y-soft ©   (04.10.05 16:06) [13]
Для Delphi это к сожалению верно из-за пресловутого RecreateWnd. Но маловероятно

ну это смотря какая у тебя последовательность операторов и о того какие свойства будут меняться у контрола и тд и тп. В некоторых случаях вероятность весьма велика.
Leonid Troyanovsky ©   (04.10.05 16:02) [11]
да, конечно CM_RECREATEWND имелось в виду..


 
y-soft ©   (2005-10-04 16:15) [17]

>jack128 ©   (04.10.05 16:12) [16]

Ну так потому WinAPI и предлагает альтернативы...

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


 
Leonid Troyanovsky ©   (2005-10-04 16:16) [18]


> y-soft ©   (04.10.05 16:02) [10]

> В 99% случаев возвращаемый результат вообще не нужен, зато
> побочные эффекты зачастую вредны...


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

--
Regards, LVT.


 
y-soft ©   (2005-10-04 16:24) [19]

>Leonid Troyanovsky ©   (04.10.05 16:16) [18]

А я разве спорю? Для разных случаев и разные решения. Я только говорю о том, что в большинстве случаев в Delphi Sinchronize используется для тривиальной перерисовки

Кстати, совсем не факт, что надо посылать сообщение непосредственно контролу или форме - хендл Application, например, в приложении не меняется... К тому же кроме PostMessage существует множество других способов межпоточного взаимодействия...


 
Leonid Troyanovsky ©   (2005-10-04 16:27) [20]


> y-soft ©   (04.10.05 16:10) [15]

> Там, кстати, и освежался... Если помните, то очередь синхронных


Тогда и цитировать надо точней. А "не тормозится очередь",
чего там вовсе не может быть, насколько я помню.

--
Regards, LVT.


 
y-soft ©   (2005-10-04 16:36) [21]

>Leonid Troyanovsky ©   (04.10.05 16:27) [20]

Ну, цитата слишком объемная получится, поэтому только указание на источник: :)

Часть VI Операции с окнами
Глава 26 Оконные сообщения
Посылка синхронных сообщений окну (в моем экземпляре это стр. 651)


 
SergP.   (2005-10-04 21:04) [22]


> К тому же кроме PostMessage существует множество других
> способов межпоточного взаимодействия...


Например, что для сабжевого случая можете предложить?


 
y-soft ©   (2005-10-05 08:14) [23]

>SergP.   (04.10.05 21:04) [22]

Для сабжевого случая (изменить Caption формы) самым простым (и эффективным) будет посылка пользовательского сообщения посредством PostMessage

Упомянутого "страшного" TWinControl.RecreateWnd можете не боятся, т.к. самопроизвольно он не вызывается :)

Конкретно для формы он вызывается только при изменении следующих свойств:

- BiDiMode;
- BorderStyle;
- Position;
- BorderIcons;
- при Docking"е;

Не изменяйте этих свойств (по крайней мере, пока работает вызывающий поток), тем более, что операция эта "тяжелая" (пересоздаются не только окно самой формы, но и окна всех ее дочерних контролов), и все будет нормально :)

P.S. Сам я пошел по другому пути и написал класс-наследник TThread.
Можете поучаствовать в тестировании, за высказанные замечания буду благодарен...

http://y-soft.comsignal.ru/Delphi/ThreadX_pas.html


 
Leonid Troyanovsky ©   (2005-10-05 09:09) [24]


> y-soft ©   (05.10.05 08:14) [23]

> Для сабжевого случая (изменить Caption формы) самым простым
> (и эффективным) будет посылка пользовательского сообщения
> посредством PostMessage


Здесь нужен не PostMessage (..WM_USER..), а
SendMessage(FrmHandle, WM_SETTEXT,..).
Потому как оно:
1. просто
2. эффективно
3. надежно.

--
Regards, LVT.


 
y-soft ©   (2005-10-05 09:12) [25]

>Leonid Troyanovsky ©   (05.10.05 09:09) [24]

Применительно к Caption cогласен, несмотря даже на синхронность вызова, т.к. отрабатывает быстро...


 
SergP.   (2005-10-05 09:24) [26]


> Здесь нужен не PostMessage (..WM_USER..), а
> SendMessage(FrmHandle, WM_SETTEXT,..).


Т.е. мне нужно менять кепшен прямо в дополнительном потокее а затем вызывать SendMessage(FrmHandle, WM_SETTEXT,..)?
Я правильно понял?


 
Leonid Troyanovsky ©   (2005-10-05 09:33) [27]


> SergP.   (05.10.05 09:24) [26]

> > SendMessage(FrmHandle, WM_SETTEXT,..).

> Т.е. мне нужно менять кепшен прямо в дополнительном потокее
> а затем вызывать SendMessage(FrmHandle, WM_SETTEXT,..)?
>
> Я правильно понял?


Нет.
Вторичный поток посылает окну, заголовок которого нужно поменять:
SendMessage(FrmHandle, WM_SETTEXT, 0, LParam(PChar(newCaption)))

И, вообще, RTFM: Synchronize method.
Пока этот материал не будет усвоен хорошо, дальнейшие изыскания
в этом направлении считаю бесполезными.

--
Regards, LVT.


 
y-soft ©   (2005-10-05 09:35) [28]

>SergP.   (05.10.05 09:24) [26]

Caption будет меняться в основном потоке, а не в дополнительном...
В дополнительном будет вызываться SendMessage(...



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

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

Наверх




Память: 0.54 MB
Время: 0.033 c
14-1128266771
Некто
2005-10-02 19:26
2005.10.30
Тётьки с брашурами


4-1125079468
ctranik
2005-08-26 22:04
2005.10.30
как узнать имя компании создавшей фаил


14-1128479169
КаПиБаРа
2005-10-05 06:26
2005.10.30
Задача про таракана


2-1128744905
intel
2005-10-08 08:15
2005.10.30
работа с Excel


2-1128744800
Киря
2005-10-08 08:13
2005.10.30
Проблема с запросом