![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно использовать 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]ИМХО Выход правильный ;-)