Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Работа со свойствами 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
4-1124890056
Forb
2005-08-24 17:27
2005.10.30
Как править приложение в памяти


2-1128852254
ArtemESC
2005-10-09 14:04
2005.10.30
Отладка


14-1129016372
KilkennyCat
2005-10-11 11:39
2005.10.30
У кого-нибудь квартира в Петербурге в аренду есть?


6-1120718169
zorik
2005-07-07 10:36
2005.10.30
Первый форум. Не судите строго.


5-1093549702
Jetus
2004-08-26 23:48
2005.10.30
Выделение дней в календаре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский