Название: QNAM+get Отправлено: pb_dev от Декабря 27, 2013, 22:02 Здравствуйте товарищи.
В чем проблема собственно. Есть вот такой запрос: Код: void Widget::startTranslate() // отправка запроса переводчику google Ответ обрабатываю в след. слоте: Код: void Widget::TranslateFinished(QNetworkReply *reply) // ответ от googla содержащий переведенный текст При выполнении метода 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())); Название: 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 содержащий переведенный текст Но меня этот вот deleteLater немного напрягает Название: Re: QNAM+get Отправлено: Fregloin от Декабря 30, 2013, 13:07 чем именно он нарягает? он вызовется, довольно скоро, но не сразу. если сделать delete, то скорее всего будет сегментация, с таким уже сталкивался.
для интереса заведи слот и связи его с сигналом reply::destroyed(), и посмотри когда он удалится ) |