crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Утекание памяти при использовании querySubObject
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 17.6.2008, 16:47
  тыб подписывал версию Qt, чтоль, а то народ голову ломает, думают про 4ку
Саша Дата 17.6.2008, 16:33
  Если кому интересно, то я кажется нашёл.

Во-первых с версии 3.3.5 этого глюка наверное нет. А я работаю с 3.3.4.
Во-вторых глюк у них в деструкторе, точнее в ф-ии clear(). см:

http://trolltech.com/developer/resources/n.../changes-3.3.5/
Fixed a bug where QAxObject::clear() did not reset the metaobject when it was cached.

Мне пришлось извращаться и написать свой querySubObject, в котором я запрещаю для полученого объекта кэшировать. Код примерно следующий:
CODE

#include <qdict.h>
class QAxMetaObject;
struct querySubObjectEx
{
QAxObject *operator ()( QAxBase *objParent, const QCString &name, const QVariant &v1 = QVariant(),
const QVariant &v2 = QVariant(),
const QVariant &v3 = QVariant(),
const QVariant &v4 = QVariant(),
const QVariant &v5 = QVariant(),
const QVariant &v6 = QVariant(),
const QVariant &v7 = QVariant(),
const QVariant &v8 = QVariant() )
{
QAxObject *obj = objParent->querySubObject( name, v1, v2, v3, v4, v5, v6, v7, v8 );

if( obj!=NULL )
{
class QAxBasePrivate
{
public:
QDict<QAxEventSink> eventSink;
bool useEventSink :1;
bool useMetaObject :1;
bool useClassInfo :1;
bool cachedMetaObject :1;
bool initialized :1;
bool tryCache :1;

IUnknown *ptr;
IDispatch *disp;

QMap<QCString, bool> *propWritable;
QAxMetaObject *metaobj;
};
QAxBasePrivate *pd = (QAxBasePrivate*)(((QAxBase*)obj)->d);
pd->tryCache = 0;
}

return obj;
}
};


Использовать можно, например, так:

querySubObjectEx()(Document,"activeElement");
Саша Дата 17.6.2008, 12:44
  Я вот думаю, может можно получить активный элемент не ф-ей querySubObject, а какой-нибудь другой? Только пока не знаю как.
Саша Дата 17.6.2008, 12:14
 
Цитата(ViGOur @ 17.6.2008, 12:02) *
Цитата(Гость_Саша_* @ 17.6.2008, 12:18) *
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
А вот это уже не нормально, можете у тебя не в этом участке код, а где-то еще, ты случаем не копируешь объект activeElement где-нибудь?

Нет.
Прям в обработчике таймера беру, а потом удаляю.
ViGOur Дата 17.6.2008, 12:02
 
Цитата(Гость_Саша_* @ 17.6.2008, 12:18) *
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
А вот это уже не нормально, можете у тебя не в этом участке код, а где-то еще, ты случаем не копируешь объект activeElement где-нибудь?
Саша Дата 17.6.2008, 11:18
  Что-то подобное думал. Тем более, что когда я выполняю программу под дебагером, после её завершения не показывается потеря памяти, хотя в других местах показывает...
Ну так, а что же делать. Дело в том, что как бы там ни было но память кушается и кушается и если оставить программу на долго, то Windows начинает ругаться, что мало виртуальной памяти, потом его начинает тошнить и всё...
ViGOur Дата 17.6.2008, 11:09
  А ты не думал, что это может быть просто веделение памяти под activeElement, которое заложено под процесс рисования? :)

А не освобождается потому, что приложение "считает", что эту память оно сможет использовать еще для каких целей или уже использует...
Саша Дата 17.6.2008, 11:00
 
Цитата(ViGOur @ 17.6.2008, 7:59) *
А как ты определил, что память течет?


При помощи диспетчера задач. Чтоб было совсем ясно и сомнений не было насчёт того, что может это течёт не в том коде, который я привёл выше, я сделал следующее:

1) Я завёл таймер, с интервалом 100мс.
2) В обработчике выполняю приведённый выше код 100 раз.
3) По истечении 30 секунд перестаю выполнять вышепреведённый код в обработчике.
4) В момент истечения 30 секунд рисую на экране кружок...

Теперь всё это запускаю и смотрю на диспетчер задач. В течении 30 секунд он показывает весьма быстрое съедание памяти моей программой (за 30 секунд съедается около 3Мб) Потом появляется кружок и память перестаёт течь.
ViGOur Дата 17.6.2008, 7:59
  А как ты определил, что память течет?
Саша Дата 16.6.2008, 20:35
  Я использую ActivX компонент браузера. И хочу получать активный элемент. Для этого выполняю следующие действия:
CODE

QAxObject *Doc = pwb->querySubObject("Document");
QAxObject *activeElement = Doc->querySubObject("activeElement");

//... некоторые действия

delete activeElement;
delete Doc;

После этого кода память и утекает. Почему? Я же вроде всё, что взял удалил.
Причём, что интересно, если брать только документ, память не утекает.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 15:39