Russian Qt Forum
Ноябрь 23, 2024, 01:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: XML-RPC клиент для rTorrent  (Прочитано 22618 раз)
fuCtor
Гость
« : Февраль 24, 2009, 16:39 »

на днях появилась идея сделать небольшую утилитку для мониторинга и управления rTorrent-ом. Нашел библиотеку(код) реализации XML-RPC клиента: http://code.google.com/p/qxmlrpc/
Данный клиент работает в асинхронном режиме. Поэтому сделал обертку над всеми методами и тд. В итоге получилось что каждый класс по таймеру (у каждого свой таймер) запрашивает обновления о состояниях, и обновляет внутренние переменные. Вот тут и возникла проблема. При наличии в списке большого количества торентов отправляется большое количество запросов, примерно 8-9 на каждый. В результате чего процессор загружается до 60% на некоторое время. Для приложения это не заметно т.к. весь этот процесс вынесен в отдельный поток.

Как можно оптимизировать данную задачу? Пока решил тем что увеличил интервал обновления данных.
А также любая конструктивная критика приветствуется =).

Исходники прилагаются.

UPD: обнаружил утечку памяти... приличную утечку  В замешательстве... но еще не устранил Грустный...
UPD2:
Утечку нашел в файле xmlrpc/client.cpp:167
QBuffer *outBuffer = new QBuffer;

Только как исправить Грустный
« Последнее редактирование: Февраль 24, 2009, 21:33 от fuCtor » Записан
vaprele07
Гость
« Ответ #1 : Февраль 25, 2009, 03:49 »

QBuffer *outBuffer = new QBuffer(this);
Записан
fuCtor
Гость
« Ответ #2 : Февраль 25, 2009, 08:11 »

Так вроде тогда объект удалится когда удалится и родитель. Но родитель (xmlrpc::Client) создается при запуске и удаляется после закрытия, а в промежутке между этим объекты все равно будут копиться, или я что-то не до понял в механизмах Qt?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Февраль 25, 2009, 09:27 »

1. или вместо
Код:
    QBuffer *outBuffer = new QBuffer;

написать :
Код:
    QBuffer outBuffer;

2. или после
Код:
    d->serverResponses[id] = outBuffer;
написать:
Код:
delete(outBuffer);
outBuffer = 0;

не?
Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #4 : Февраль 25, 2009, 09:34 »

непонятно зачем вот это?
Код:
delete(outBuffer);
outBuffer = 0;

если вы выше объект в стеке создаете.
Код:
QBuffer outBuffer;
Записан
BRE
Гость
« Ответ #5 : Февраль 25, 2009, 09:40 »

не?
Не.

Камрады, посмотрите весь код. Этот буфер используется в requestFinished. Вот там и нужно его освобождать.
Внимание обращаем на те места где используется d->serverResponses.take(id)

P.S. Да, это только беглый взгляд на этот код, возможны недосмотры.  Улыбающийся
Записан
vaprele07
Гость
« Ответ #6 : Февраль 25, 2009, 10:22 »

может стоит QByteArray хранить вместо буфера?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Февраль 25, 2009, 10:26 »

2 spirit  , внимательнее надо быть ! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
fuCtor
Гость
« Ответ #8 : Февраль 25, 2009, 12:45 »

Вот итоговый слот, утечки нет наконец-то =)
Код
C++ (Qt)
void Client::requestFinished(int id, bool error)
{
   if ( !d->serverResponses.count(id) ) {
       return;
   }
 
#ifdef XMLRPC_DEBUG
   qDebug() << "request" <<  d->methodNames[id] <<  "finished, id=" << id << ", isError:" << error;
#endif
 
   if ( error ) {
       //if ( d->serverResponses.count(id) )
 
       delete d->serverResponses.take(id);
 
       emit failed(id, -32300, d->http->errorString() );
       return;
   }
 
   if ( d->serverResponses.count(id) ) {
QBuffer * inBuffer = d->serverResponses.take(id);
       QByteArray buf = inBuffer->buffer();
 
       //qDebug() << "xml-rpc server response:\n" << QString(buf);
 
       Response response;
 
       QString errorMessage;
       if ( response.setContent( buf, &errorMessage ) ) {
           Q_ASSERT( !response.isNull() );
 
           if ( response.isFault() ) {
               qDebug() << "request failed:" << response.faultCode() << response.faultString();
               emit failed(id, response.faultCode(), response.faultString() );
           } else {
#ifdef XMLRPC_DEBUG
               qDebug() << response.returnValue().pprint();
#endif
               emit done( id, response.returnValue() );
           }
 
       } else {
 
#ifdef XMLRPC_DEBUG
           qDebug() << "incorrect xmlrpc response:" << errorMessage;
           qDebug() << QString(buf);
#endif
           emit failed(id, -32600, "Server error: Invalid xml-rpc. \nNot conforming to spec.");
       }
delete inBuffer;
   }
 
}
Надо будет автору кода отправить изменения.

А основная часть вопроса остается актуальной, можно ли как-нибудь оптимизировать обновление данных?
UPD: поправил при случаи ошибки.
« Последнее редактирование: Февраль 25, 2009, 13:34 от fuCtor » Записан
Rcus
Гость
« Ответ #9 : Февраль 25, 2009, 13:01 »

Все же есть. если произойдет ошибка то буфер не удалится
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Февраль 25, 2009, 14:11 »

Так нужно или не нужно писать патч?

ЗЫ: мне эта билиотека тоже оч нужна будет! Поэтому и интересуюсь! Улыбающийся

ЗЫЗЫ: киньте кто- нить на почту scapig@yandex.ru и на scapig2040@rambler.ru архив с этой библой, т.к у нас на работе админ палит то что кто качает... да и скачать из Windows не имея svn не хочется (по одному файлу) Улыбающийся
« Последнее редактирование: Февраль 25, 2009, 14:16 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #11 : Февраль 25, 2009, 14:13 »

имхо, нужно, а то как-то с утечкой несерьезно  Подмигивающий
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Февраль 25, 2009, 14:16 »

Ну так исправленную версию и скиньте мне на почту пожалуйста! Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
fuCtor
Гость
« Ответ #13 : Февраль 25, 2009, 14:24 »

Отправил, смотрите почту.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Февраль 25, 2009, 14:36 »

не, ничего нету... сдублируйте если не трудно и на :  scapig2040@rambler.ru

PS: злостный админ фильтрует Грустный
« Последнее редактирование: Февраль 25, 2009, 14:38 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 22.