Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизКак правильно использовать 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;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.011 c