crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 16:13