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

Вниз

Проблема "лишних" GDI-объектов в corba-сервере   Найти похожие ветки 

 
serg_   (2003-05-27 14:02) [0]

Доброго времени суток!

Уважаемые мастера, помогите разобраться в следующей проблеме. Имеется corba-сервер (написанный на Delphi7 + патч) который служит для генерации битмепов. Т.е. создает экземпляр TBitmap`a, что-то на нем рисует и отсылает клиенту как массив байтов. Беда в том что при создании битмапа, состоящего из большого числа (порядка 10000) объектов (линии, точки, области) сервер "недорисовывает" картинку. Т.е. рисуем только первые 6000 объектов. Причем ошибка происходит при прорисовке примерно каждого 10 битмепа. Именно примерно, т.е "неудачными" могут быть 7, 18, 23, 27 битмепы (мною никакой закономерности не обнаружено). Точно также происходит и с объектами, которые отрисовываются на битмепе (иногда рисуем только первые 4338, иногда 6589, а иногда отрисовываем все объекты). Все операции связанные с отрисовкой заканчиваются успешно (стоят соответствующие проверки). Рисовать пробовал как на канве битмапа так и апи-шными функциями - к сожалению, не помогает. Подобного рода "неустойчивость" работы проявлялась на разных компьютерах (2000проф, 2000сервер). Единственная обнаруженная закономерность - это увеличение числа GDI-объектов (смотрел через Task Manager)) в случае ошибочного битмепа. Отсюда закрадывается подозрение, - а может быть борландовская реализация корбы не совсем корректна с ними. Посоветуйте плз куда можно копать/смотреть. Да, еще, в corba.pas менял IsMultiThread, прибивал обработчики исключений - не помогло, ошибка осталась.


 
Nikols ©   (2003-05-27 15:50) [1]

Не понял связи между локальной работой сервера - генерации битмепов и удаленным CORBA вызовом... Пришлите код?


 
serg_   (2003-05-27 17:26) [2]

Давайте будем считать, что для простоты эксперимента клиент шлет одинаковые вызовы. Сервер, соответственно, должен сгенерить одинаковые битмапы. Примерно 90% действительно одинаковые. Оставшиеся 10% недорисованы. Постить сюда код несколько неудобно (много его). Скажу лишь, что если обрезать сервер (исключив из него корбу) и сделав из него некое отладочное GUI-шное приложение, то с генерацией битмапов никаких проблем не будет.


 
epflorov ©   (2003-05-27 19:55) [3]

Будем искать :)

Итак дополнительные вопросы:
1. В какой массив вы записываете рисунок? sequence<octet>? или еще как?
2. Каков размер массива при передаче обрезанных рисунков? Именно размер (можно в байтах) а не количество оъектов в рисунке.
3. Все таки интересен кусок где происходит формирование данного массива.

Пока все...


 
serg_   (2003-05-28 14:20) [4]

1. Именно так - typedef sequence<octet> TByteArray;
2. Размер массива есть размер сгенеренного битмепа (он может меняться в зависимости от параметров вызова). Если вызов одинаковый, то размер "обрезанного" рисунка совпадает с размером "необрезанного" (битмеп имеет одинаковые высоту и ширину).
3. VBitmap.SaveToStream(VStream)
function Stream2ByteArray(AMemoryStream: TMemoryStream): ByteArray;
begin
 SetLength(Result, AMemoryStream.Size);
 Move(AMemoryStream.Memory^, Pointer(Result)^, AMemoryStream.Size);
end;

Имхо, стоит копать не в формировании массива. Дело в том, что в сервере, еще до формирования ByteArray в тестовых целях стоит VBitmap.SaveToFile(). Сохраненный на диске битмеп примерно в 10% случаев получается "обрезанным".


 
KA_ ©   (2003-05-29 09:09) [5]

serg_   (28.05.03 14:20)
Значит "обрезает" раньше :)
Проверь алгоритм заполнения битмепа.


 
serg_   (2003-05-29 10:41) [6]

KA_
Проверял, я писал выше что брал алгоритм и вставлял его в простое приложение (без всяких там корб, многопоточностей и пр.). Так вот в этом случае алгоритм отрабатывал правильно. _Всегда_ правильно. В случае же с корбой прям беда какая-то:\. Коннекчусь одним единственным клиентом, посылаю один и тот же запрос, а на выходе то нормальные, то "битые" битмепы. Причем битость происходит именно тогда, когда увеличивается (практически всегда на 5) счетчик GDI-объектов. Есть подозрение, что борлондовская реализация как-то не так ведет по отношению к CreatePen, CreateSolidBrush, CreateFontIndirect, SelectObject, DeleteObject


 
KA_ ©   (2003-05-29 18:48) [7]

Попробуй заменить их виндовым API.


 
serg_   (2003-05-30 11:23) [8]

Оказалось, что проблема в использовании ф-ции Polygon при ее отключении или замене на PolyLine отрабатывает корректно. Теперь вот думаю, может самому, ручками, полигоны закрашивать (благо они все выпуклые).



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

Форум: "Corba";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.03 c
14-1097250813
Shurik_212
2004-10-08 19:53
2004.10.31
Неохота убивать винду


1-1098080893
Kniaz
2004-10-18 10:28
2004.10.31
Перекодировка файла


14-1097333743
olookin
2004-10-09 18:55
2004.10.31
Позволю себе загрузить людей...


14-1097466794
080D:07BBh
2004-10-11 07:53
2004.10.31
Linux XP


1-1097654097
Pentium133
2004-10-13 11:54
2004.10.31
О TList и функциях





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