![]() |
Модераторы: MetalFan |
![]() ![]() ![]() |
|
phanatos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 9.8.2006 Репутация: 1 Всего: 2 |
Доброе время суток, коллеги! Требуется мозговой штурм. Бэкграунд такой: пишу тулбар для Internet Explorer. В качестве заготовки взял пример с Bsalsa.com. Все замечательно работает, если бы не одно 'НО'. Если использовать глифы, имэджы или даже просто выводить текст, используя Canvas на форму тулбара или TPanel, то при открытии нескольких окон Iexplorer с завидной периодичностью вываливаются ошибки типа: "Canvas does not allow drawing" или "Out of system resources", после чего выводимая на форму графика, либо не прорисовывается вовсе, либо рисуется "черный квадрат", либо ошибка вызывает молчаливое закрытие эксплорера, что совсем неприятно. Частота ошибки пропорциональна интенсивности работы с графикой. Т.е. если это просто обычные SpeedButton-ы, то ошибка случается достаточно редко и при открытии большого количества окон. А если это какой-нибудь компонент, показывающий анимацию или обновляющий что-то на экране (например TProgressBar), то обычно при открытии второго-третьего-n-ого окна все и происходит. Есть большая доля вероятности, что дело в совместном доступе к GDI, а именно, разделение ресурсов в потоке, поскольку такого рода ошибки бывают, если в потоке что-то рисовать на канвасе. Внимание, вопрос: как быть? Что где можно подкрутить, чтобы заработало?
|
|||
|
||||
Letov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 321 Регистрация: 22.2.2007 Где: Санкт-Петербург Репутация: нет Всего: 4 |
можно попробовать сжать графику и запускать для нее отдельный процесс.
Постораюсь помочь и выложить какой нибудь пример на http://spb-kolpino.narod.ru/programmer/index.htm
-------------------- Не бывает плохих языков программирования. Бывают плохие программисты... |
|||
|
||||
phanatos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 9.8.2006 Репутация: 1 Всего: 2 |
Что-то я не догоняю... VCL ведь и так в основном потоке выполняется. Как мы можем помочь ниткой, если глючит основной поток?
И вот ещё интересная штука: компилируем наш банд, запускаем эксплорер, открываем два окна эксплорера, чтобы в каждом из них появился наш тулбар. И на одном из них щелкаем заранее заготовленную кнопку, которя посылает Window-сообщение другой инстанции тулбара, чтобы уже тот, от своего имени выполнил определенный метод - т.е. показал простейшую форму из трех едитов. Так вот, с вероятностью 50% произойдет ошибка Out of system resources, 25 % - что форма покажется нормально, и ещё 25 - покажется недоинициализированная форма - либо все контролы созданы, но не инициализированы их Published свойства (т.е. просто в кучу все лежат, как при динамическом содании объектов), либо глифы на кнопках "ОК" и "Отмена" черные или не прорисованные. Т.е. такое ощущение, что в процессе инициализации формы и происходит ошибка. Скачал ради интереса демо с Shellplus.com с компонентами для создания тулбаров. Думал - раз там своя специальная форма отнаследованна, так типа все будет ок. Нет - все те же глюки замечаю и там. Причем тестировал на разных ОС и с разными версиям эксплорера (6 и 7). Вот такое странное поведение. Где грабли, куда жаловаться? |
|||
|
||||
phanatos |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 9.8.2006 Репутация: 1 Всего: 2 |
В общем, как и предпологалось, все эти глюки решаются с помощью мьютекса. Но от понимания ситуации я далек - оба кода:
без защиты глючат одинаково, хотя во втором должен получиться STA с proxy. Может быть мне кто-нибудь растолкует, почему такое происходит? ![]() |
||||
|
|||||
phanatos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 9.8.2006 Репутация: 1 Всего: 2 |
Кто, если не мы =)
Все оказалось просто. При регистарции сервера в ключе реестра InProcServer создается ключ ThreadingModel, а это как раз признак Appartment модели. Для Single - его быть не должно. Почему всегда создается ключ ThreadingModel, я ещё не разобрался, но теперь тулбар работает как часы - милое дело =) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |