Форум: "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.031 c