Russian Qt Forum

Qt => Работа с сетью => Тема начата: pb_dev от Декабря 27, 2013, 22:02



Название: QNAM+get
Отправлено: pb_dev от Декабря 27, 2013, 22:02
Здравствуйте товарищи.
В чем проблема собственно. Есть вот такой запрос:
Код:
void Widget::startTranslate() // отправка запроса переводчику google
{
    ui->TranslatedText->clear();
    QString TextToTranslate = ui->TextToTranslate->toPlainText();
    QString s_lang = "en";
    QString t_lang = "ru";

    qnam->get(QNetworkRequest(QUrl(UrlToGoogleTranslator + TextToTranslate + "+&sl" + s_lang + "&tl" + t_lang)));
}  

Ответ обрабатываю в след. слоте:
Код:
void Widget::TranslateFinished(QNetworkReply *reply) // ответ от googla содержащий переведенный текст
{
    QString answer = QString::fromUtf8(reply->readAll());
    ui->TranslatedText->insertPlainText(ParseText(answer));

    reply->deleteLater();
}

При выполнении метода Get (в первый раз, сразу после запуска программы) размер программы в памяти резко увеличивается с 5мб до 7мб(+/-).  Есть пара мыслей, но почему так много понять не могу.


Название: Re: QNAM+get
Отправлено: gil9red от Декабря 27, 2013, 22:08
Текст, который вы вставили в текстовый редактор (походу QTextEdit или QTextBrowser) тоже весит чего то :)


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 27, 2013, 22:11
Текст, который вы вставили в текстовый редактор (походу QTextEdit или QTextBrowser) тоже весит чего то :)

QplainTextEdit содержащий слово hello

2 gil9red:
Проблема в том что именно когда я первый раз (после запуска программы) вызываю этот слот происходит это явление. В след. запросах память остаётся 7мб(+/-) только задержек таких уже нету (все быстро переводится)

Вопрос остается тот же


Название: Re: QNAM+get
Отправлено: Bepec от Декабря 27, 2013, 22:50
А давайте подумаем что происходит вместе.

Очищается поле,
Создаются строчки,
Создаётся объект типа QNetworkReply.

Как думаете, что может занимать 7 мб?


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 27, 2013, 23:02
А давайте подумаем что происходит вместе.

Очищается поле,
Создаются строчки,
Создаётся объект типа QNetworkReply.

Как думаете, что может занимать 7 мб?

Не 7 а 2. После запуска, программа весит 5мб, после отправки запроса увеличивается на 2мб. Не в этом суть.

Повторюсь, после нажатия на кнопки "Отправить", в первый раз, после запуска программы, потребляемая память увеличивается на 2мб, что создает видимость задержки примерно в 2сек.

Во второй и n(ый) раз уже, эта задержка настолько мизерная, что её почти не видно.

Ваше виденье ситуации? Что нужно тут изменить


Название: Re: QNAM+get
Отправлено: Bepec от Декабря 27, 2013, 23:20
А зачем менять?

Заполните пожалуйста :)

1) Очистка поля - __ мб
2) Создаются строчки - __ мб
3) Создаётся QNetworkReply - __ мб

Я вас тихонько подвожу.

PS и всё же, 5 мб вам делают погоду? :P


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 27, 2013, 23:33
А зачем менять?

Заполните пожалуйста :)

1) Очистка поля - __ мб
2) Создаются строчки - __ мб
3) Создаётся QNetworkReply - __ мб

Я вас тихонько подвожу.

PS и всё же, 5 мб вам делают погоду? :P

Убрал очистку поля, создал строки в конструкторе, остается QNReply который весить 2мб физически не может

пс: Вы ведете к тому чтоб я юзал чистые сокеты?) Что Qt га*но, и юзать классы неправильно?) Или я Вас неправильно понял?)

ппс: вот коннекты

Код:
connect(ui->btn_Translate, SIGNAL(clicked()), this, SLOT(startTranslate()));
connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(TranslateFinished(QNetworkReply*)));


Название: Re: QNAM+get
Отправлено: gil9red от Декабря 28, 2013, 00:48
Когда вы имеете дело с qt, забудьте про экономию памяти :)
утечки памяти, конечно, не нужно устраивать, но трястись из-за нескольких мегабайт не стоит )


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 28, 2013, 01:57
Когда вы имеете дело с qt, забудьте про экономию памяти :)
утечки памяти, конечно, не нужно устраивать, но трястись из-за нескольких мегабайт не стоит )

Спасибо за совет)
Но мне кажется что-то тут нечисто. У меня Qt 5.1.1. Подозреваю это какой-то баг, надо будет попробовать на других версиях
А может я что-то упустил...


Название: Re: QNAM+get
Отправлено: gil9red от Декабря 28, 2013, 02:02
У меня 4.8.* и я бед не знаю ;D


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 28, 2013, 02:10
У меня 4.8.* и я бед не знаю ;D

Где-то читал коммент, цитирую: "К сожалению Qt5 ожидания не оправдал, пришлось вернутся к 4ой версии"  :'(

Даже так: Уменьшен размер установочного файла, на целых десять мегабайт!! (переход на Qt5 не оказался оправданным, вернулись к 4.8.4)


Название: Re: QNAM+get
Отправлено: gil9red от Декабря 28, 2013, 02:46
Просто Qt5, похоже, еще пока "сырой" :)


Название: Re: QNAM+get
Отправлено: Bepec от Декабря 28, 2013, 08:47
Чем мне не нравится Qt5, тем что в него засунули кучу всякой фигни и приплюснули QML.
Сам на Qt 4.7.2 сижу.


Название: Re: QNAM+get
Отправлено: LisandreL от Декабря 28, 2013, 15:58
При выполнении метода Get (в первый раз, сразу после запуска программы) размер программы в памяти резко увеличивается с 5мб до 7мб(+/-).  Есть пара мыслей, но почему так много понять не могу.
Ну подгружает она в память dll. Ну не при загрузке, а при первом обращении к функции эту dll использующую. В чём проблема-то?


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 28, 2013, 16:20
При выполнении метода Get (в первый раз, сразу после запуска программы) размер программы в памяти резко увеличивается с 5мб до 7мб(+/-).  Есть пара мыслей, но почему так много понять не могу.
Ну подгружает она в память dll. Ну не при загрузке, а при первом обращении к функции эту dll использующую. В чём проблема-то?

Во-во, что-то ближе к истине, только когда я через дебагер посмотрел, там он этих dll загружает не одну, а штук 5 (+/-)


Название: Re: QNAM+get
Отправлено: Fregloin от Декабря 29, 2013, 10:49
идет банальное кеширование, и скорее всего при первом запросе создается отдельный поток для сокета, который далее используется для приема/отправки данных. и вы не забываете удалять все QNetworkReply через deletaLater?


Название: Re: QNAM+get
Отправлено: Fregloin от Декабря 29, 2013, 10:51
еще можете запустить через valngrind и глять где что потекло. хотя в последних версиях qtcreator он показывает далеко не все утечки как я выяснил на тестовых примерах. зато очень много утечек памяти в системных либах, видеодровах ну и самой qt ). по крайней мере так показывает valgrind  ???


Название: Re: QNAM+get
Отправлено: pb_dev от Декабря 30, 2013, 10:33
и вы не забываете удалять все QNetworkReply через deletaLater?

Та вроде нет

Код:
void Widget::TranslateFinished(QNetworkReply *reply) // ответ от googla содержащий переведенный текст
{
    QString answer = QString::fromUtf8(reply->readAll());
    ui->TranslatedText->insertPlainText(ParseText(answer));

    reply->deleteLater();
}

Но меня этот вот deleteLater немного напрягает


Название: Re: QNAM+get
Отправлено: Fregloin от Декабря 30, 2013, 13:07
чем именно он нарягает? он вызовется, довольно скоро, но не сразу. если сделать delete, то скорее всего будет сегментация, с таким уже сталкивался.
для интереса заведи слот и связи его с сигналом reply::destroyed(), и посмотри когда он удалится )