Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt 4.6] приложение загружает ЦП 
V
    Опции темы
pycha
Дата 23.6.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



здраствуйте, у меня приложение работает по схеме - получил ссылку , обработал , выдал результат, но когда ссылок много оно реально подвисает. как сделать чтобы загрузка процесора была бы поменьше. я так понимаю что надо процес обработки помещать в отдельный процес и его потом на время задерживать его исполнение? ну задерживать эт я знаю можно с помощью SleeperThread::msleep();. а вот как открыть в отдельном процесе? ну вообщем посоветуйте что надо сделать?
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
Alca
Дата 23.6.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



http://doc.qt.nokia.com/latest/threads-starting.html
http://web.mit.edu/qt/www/qthread.html

Добавлено через 40 секунд
Цитата

надо процес обработки помещать в отдельный процес

в отдельный поток 


--------------------
PM WWW ICQ Skype Jabber   Вверх
pycha
Дата 30.6.2011, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



все, с процесами разобрался, теперь другая проблема . идет утечка памяти. пробовал решить таким способом 
Код

connect(thread , SIGNAL(finished()),thread , SLOT(deleteLater()));


но это проблему не решило , память как уходила так и уходит, прога сначало имеет вес 90 метров в оператве и через минут 7 уже полгига, через полчаса забирает на себя всю оператву. как это можно эфективно решить?


--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
borisbn
Дата 30.6.2011, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



pycha, внимательно просмотри все new. Каждому должен соответствовать свой delete. Причём он должен быть не только написан, но и должен вызываться

Вообще-то, не видя кода, сказать что-либо можно только обладая телепатией. У меня оная не развита smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
pycha
Дата 30.6.2011, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



все что связано с потоком в этих строках
Код

    MyThread *thread = new MyThread();
    connect(thread,SIGNAL(insertToBase2()),this,SLOT(insertToBase3()));
    connect(thread,SIGNAL(finished ()),this,SLOT(obrabotkaEnd2()));
    connect(thread , SIGNAL(finished()),thread , SLOT(deleteLater()));
    thread->start();
    thread->setPriority(QThread::LowestPriority);

    thread->obrabotka(obrabotaniy, reply->url().toString(),browserNewOnlyChB->isChecked());


при окончании обработки в потоке вызываю quit();

я думал что в qt  деструктор вызывается сам

Это сообщение отредактировал(а) pycha - 30.6.2011, 07:36
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
borisbn
Дата 30.6.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(pycha @  30.6.2011,  07:14 Найти цитируемый пост)
я думал что в qt  деструктор вызывается сам

вызывается, если
1) Твой объект наследован от QObject
2) В качестве paernt'а указан не 0, а другой QObject, который, собственно, и вызывает деструктор.

Небольшая ремарка: Qt - это не язык, и даже, по большому счёту, не Framework. Qt - это набор Си++-ных классов, поэтому само в нём ничего не происходит.

Цитата(pycha @  30.6.2011,  07:14 Найти цитируемый пост)
все что связано с потоком в этих строках

потоки сами по себе не могут вызывать лики памяти. Их вызывает то, что в какой-то функции выделяется память, эта память нигде не освобождается, и эта функция постоянно вызывается, например в потоке.

И всё-таки маловато данных, чтобы понять, где у тебя течёт память


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
pycha
Дата 30.6.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



функция, в которой находится обьявление этого потока, вызывается 6 -10 раз в минуту, с каждым вызовом функции создается новый поток который не убивается по окончании процедуры в нем и со временем количество неубитых потоков возрастает все больше и тянут на себя все больше оперативки. мне надо найти способ который поможет правильно убить поток после окончания обработки в нем так чтобы освободилась память

кстати может пригодится, вот как я обьявил сам поток
Код

class MyThread : public QThread
{
    Q_OBJECT
  public:
    MyThread(QObject *parent = 0);
};



MyThread::MyThread(QObject *parent) :
        QThread (parent)
{
  
}


по идеи вроде правильно



Это сообщение отредактировал(а) pycha - 1.7.2011, 00:11
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
borisbn
Дата 1.7.2011, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



pycha, всё равно данных недостаточно. Покажи весь проект, только убери из него непосредственно обработку (поставь вместо неё троеточие). Во-первых и ты код не будешь раскрывать, во-вторых искать ошибку будет проще


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
pycha
Дата 1.7.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



упростил как мог, вот

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  crawler.rar 2,11 Kb
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
borisbn
Дата 1.7.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



ууууу. тут целый ворох проблем. начнём (закатывает рукава)
1. В ф-ции zagruzkaStranici создаётся QNetworkAccessManager *manager и нигде не удаляется.
2. В ф-ции zagruzkaFinished создаётся QWebView *text и нигде не удаляется
3. Ф-ция MyThread::obrabotka выполняется в этом же (в интерфейсном) потоке, а созданный поток живёт совсем немного, т.к. в ф-ции MyThread::run() ничего нет
Цитата

  if(stopped)
    return;


щаз немного занят, поэтому подумай сам пока, что надумаешь - пиши сюда, а я потом посмотрю и помогу допилить. Ok ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
pycha
Дата 1.7.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



что сделал: посвавил delete для text.  как удалить QNetworkAccessManager *manager незнаю, пробовал после того он передал QNetworkReply* подать сигнал и соеденить его с deleteLater() у менеджера но получилась капосная вещь. 
дальше поток: добавил функцию 
Код

void newValue(QString &obrabotaniy2, QString url2,bool is2)
{
    is=is2;
    url = url;
    obrabotaniy =obrabotaniy2;
}


которая перед стартом потока принимает значения которые надо обрабабывать

обработку поместил в run 

Код

void MyThread::run()
{

    obrabotka();

    if(stopped)
        return;
}




вот так сейчас создаю поток

Код

void crawler::zagruzkaFinished(QNetworkReply* reply)
{

    QByteArray byte = reply->readAll();


    QWebView *text = new QWebView(0);

    text->page()->settings()->setAttribute(QWebSettings::AutoLoadImages, 0);
    text->setHtml(byte);
    QString obrabotaniy = text->page()->mainFrame()->toHtml ();
    delete text;

              MyThread *thread = new MyThread();
    connect(thread,SIGNAL(insertToBase2()),this,SLOT(insertToBase3()));
    connect(thread,SIGNAL(finished ()),this,SLOT(obrabotkaEnd2()));
    connect(thread , SIGNAL(finished()),thread , SLOT(deleteLater()));
    thread->newValue(obrabotaniy, reply->url().toString(),browserNewOnlyChB->isChecked());
    thread->start();
    thread->setPriority(QThread::LowestPriority);


}


в поиках решения попал на эту  статью, в исходниках у себя обьявил 
Код

virtual void run(); 

 и подкоректировал вот тут    
Код

    MyThread(QObject * parent = 0 ) : QThread(parent)
    {
        moveToThread(this);
    }


но память все продолжает течь

Это сообщение отредактировал(а) pycha - 1.7.2011, 19:18
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
pycha
Дата 2.7.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


главный анастазиолог
*


Профиль
Группа: Участник
Сообщений: 239
Регистрация: 20.6.2008
Где: Украина

Репутация: нет
Всего: 13



все, вопрос решен. утечка была какраз из за QWebView. там если его сразу уничтожать то сервер понимал что работает бот и поэтому я его оставил. потом попробовал его соединить с QTimer чтобы его вырубало через определенное время и все пошло как по маслу, извините за подпоченые нервы. 

Это сообщение отредактировал(а) pycha - 5.7.2011, 19:59
--------------------
ищу хакера со знанием компьютера длятехкт
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.