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

Вниз

Как правильно использовать VCL в многопоточном приложении?   Найти похожие ветки 

 
Zelius   (2003-01-27 20:46) [0]

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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


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


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

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

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


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


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

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


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

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


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

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


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

MFC $-)


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


> Zelius


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


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

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



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

Форум: "Основная";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
3-15396
qwerty2
2003-01-21 12:44
2003.02.06
Перехват исключения от сервера БД


14-15939
Uncle Archi
2003-01-21 21:26
2003.02.06
Zip


1-15694
NewGuest
2003-01-26 14:11
2003.02.06
На 7 делфи возникает такая ошибка (RX Lib). При испол. rxкомпане


9-15391
Анат
2002-08-17 22:32
2003.02.06
Мужики , пишу РПГ ,всё путём ,но есть пара вопросов...


3-15520
Ihtiandr
2003-01-21 12:08
2003.02.06
UpdateSQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский