Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно использовать VCL в многопоточном приложении? [D7, Win2k]


Zelius ©   (2003-01-27 20:46:00) 

К сожалению, простые ответы типа "используй Synchronize" не подходят. Проблема: пишу расширение для интернет эксплорера в виде собственного тулбарчика, вроде все работает, но периодически глючит (я уже писал в форум по этому вопросу - безответно), то эксепшн выдаст, то "Out of system resources" говорит! В течении недели я думал, пробовал, гадал и тут меня осенило! Дело в том, что один процесс ИЕ (Интернет Эксплорер) может иметь несколько окон, каждый со своим потоком и со своим экземпляром TForm, создаваемым в этом же потоке, НО ПРОЦЕСС-ТО ОДИН И TApplication и TScreen ТОЖЕ ОДНИ! Значит, идет многопоточное использование ядра VCL! Вопрос, как правильно разрулить эту ситуацию??? Ну уж очень не хочется писать на WinAPI ( единственный выход, который я вижу). Спасибо за внимание!


Zelius   (2003-01-29 12:54:00) [1]

Что бы не занимать много места, вот ссылка на источник, откуда я брал пример: http://www.euromind.com/iedelphi/ie5tools/bandobjects.htm
Он точно так же глючит, то есть например запускаем эксплорер, в нем делаем New Window, вызывает на тулбаре хинт в обоих экземплярах и закрываем оба эксплорера. Должен быть глюк! Уточню, что у меня Internet Explorer 6ой версии.


Digitman   (2003-01-29 08:25:00) [2]


> Zelius


Приводи свой код


Cobalt   (2003-01-28 21:00:00) [3]

MFC $-)


Zelius   (2003-01-28 19:40:00) [4]

Если нет возможности использовать VCL, то как вариант - использовать KOL библиотеку... А есть ли другие библиотеки для создания windows-контролов?


Zelius   (2003-01-28 14:07:00) [5]

Digitman: Сообщения в мой тулбар доходят, иначе бы он не отрисовывался и TEdit не получал бы ввода. Я не понимаю, как работает Эксплорер, но он заточен на то, что его расширения должны получать сообщения!


Dms   (2003-01-28 12:29:00) [6]


> Кот Бегемот © (28.01.03 11:24)
> Используй не TThread - а "Библтотеку параллельного программирования
> GALA"
> http://delphi.mastak.ru/cgi-bin/download.pl?get=990158073&n=0
> там реализовано на обмене сообщений :)

Вот это бред ! Параллельное программирование совсем не для этих целей ! Не фига смуту в обсуждение вносить.


Digitman   (2003-01-28 12:17:00) [7]


> А ему и не надо знать, за него это делают винды вызовом
> DispatchMessage и сообщения адресуются моему окну.


Чушь. DispatchMessage() вызывает кодовый поток для диспетчеризации сообщений, выбираемых из очередей сообщений, ассоциированных с код.потоком и окон, созданных им.

Любой код.поток, который создал окно либо хочет реагировать на сообщения, посылаемые ему по PostThreadMessage(), должен выполнять хотя бы такой цикл :

while доступно_очер_сообщение_выбираемое_из_ассоциированных_очередей do
begin
TranslateMessage(..); // необязательно в большинстве случаев для доп.потоков
DispatchMessage(..); вот она - диспетчеризация выбранного сообщения !
end;


Zelius   (2003-01-28 12:17:00) [8]

malkolinge: А он там пишет про использование TApplication в многопоточном приложении? Ведь вопрос именно в этом! Или как это обойти...


malkolinge   (2003-01-28 12:11:00) [9]

Короче, среди всех ВКЛ контролов только ТСАНВАС потокозащищенный. А тебе лучше всего взять Стива Тексейру И почитать про потоки а особенно про синхронизацию :)


Zelius   (2003-01-28 12:07:00) [10]

Digitman:
А ему и не надо знать, за него это делают винды вызовом DispatchMessage и сообщения адресуются моему окну.


Digitman   (2003-01-28 11:49:00) [11]

да, но код.поток IE, вызывающий методы твоего COM-объекта не может диспетчеризовать сообщения окну формы, создаваемой в ходе исполнения тобой COM-вызовов ! Ибо код.поток IE знать не знает, что у тебя будет организовано какое-то окно и оно будет нуждаться в диспетчеризации адресованных ему сообщений


Zelius   (2003-01-28 11:29:00) [12]

Для Digitman:
Я не создаю потоки, я использую тот поток, который мне выдал эксплорер, то есть в котором он создал мой COM объект.


Кот Бегемот   (2003-01-28 11:24:00) [13]

Используй не TThread - а "Библтотеку параллельного программирования GALA"
http://delphi.mastak.ru/cgi-bin/download.pl?get=990158073&n=0
там реализовано на обмене сообщений :)


Digitman   (2003-01-28 11:05:00) [14]

Не знаю как в D7, но в D5 Synchronize() не даст ожидаемый результат (либо результат будет непредсказуемым), если самый первый объект класса-наследника TThread создается не в основном код.потоке вызывающего процесса. В случае с тем же IE наиболее вероятным будет факт вызова конструктора TThread (создаваемого в контексте конструирования экз-ра COM-объекта) в доп.потоке.


Zelius   (2003-01-28 10:50:00) [15]

Для vuk:
Если бы все было так просто и можно было бы руками синхронизировать, то я давно бы уже это сделал! Но проблемы глубже, они в коде TApplication, который я даже не вызываю - в хинтах (другие места я не рассматривал пока)! Объектная модель стоит Apartment, но это тоже не решение, потому что объекты, а значит и VCL объекты создаются в разных потоках, какую модель не задай...


vuk   (2003-01-27 22:44:00) [16]

Елки-моталки... Так ведь Synchronize для того и сделан, чтобы обращение к ядру VCL происходило только из основного потока процесса.
Кстати, насколько я понимаю, тулбар - это COM объект. Может все решится выбором правильной потоковой модели?


Cobalt   (2003-01-27 22:32:00) [17]

ИМХО Выход правильный ;-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо