Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надёжность сигналов-слотов, В приведённом случае 
:(
    Опции темы
Lindemann66
  Дата 18.10.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


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

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



Всем привет!

Представьте
Программа, выполняющая сканирование сайтов на предмет обновлений
Допустим, в БД 50 сайтов = 50 сканирующих "потоков"...
В каждом "потоке" - скачка html-кода из интернета, парсинг, внесение в БД...

Я специально закавычил слово "поток", потому что, в данном случае, использование потоков не обязательно...

Важно другое

Как организовать такую работу наиболее правильным "архитектурно-технологически" способом?
Мне просто интересны варианты smile

Уже пробовал создавать отдельный поток под каждый сайт, но проблема в том, что сканирование сайтов (читай - использование QWebPage) необходимо делать в главном (GUI) потоке
К тому же, этот механизм не показал особой стабильности...
Может, из-за корявости реализации, не использования QthreadPool'ов (ксттаи, интересно, насколько хорош QThreadPool))

Сейчас делаю так...(просто пример, но суть работы та же, что и в программе)
Analyzer
Код

class Analyzer : public QObject {
    Q_OBJECT
public:
    Analyzer();
    ~Analyzer();
public slots:
    void analyze(QString str);
private:
    QList<Timer *> m_timers;
};

Analyzer::Analyzer() {
    //запускаем 100 таймеров
    for (int i = 0; i < 100; i++) {
        Timer *timer = new Timer(10000, i);
        m_timers.push_back(timer);
        connect(timer, SIGNAL(analyze(QString)),
                this, SLOT(analyze(QString))
                );
    }
}

Analyzer::~Analyzer() {
    for (int i = 0; i < m_timers.size(); i++) {
        delete m_timers[i];
    }
}

void Analyzer::analyze(QString str) {
    qDebug() << "Timer " + str;
}


Timer
Код

class Timer : public QObject {
    Q_OBJECT
public:
    Timer(int interval, int number);
    ~Timer();

public slots:
    void needAnalyze();

signals:
    void analyze(QString str);

private:
    int m_number;
    QTimer *m_timer;
};
Timer::Timer(int interval, int number) {
    m_timer = new QTimer(this);
    //раз в 10 секунд
    m_timer->start(interval);

    connect(m_timer, SIGNAL(timeout()),
            this,    SLOT(needAnalyze())
            );

    m_number = number;
}

Timer::~Timer() {
    m_timer->stop();
    delete m_timer;
}

void Timer::needAnalyze() {
    emit analyze(QString::number(m_number));
}


То есть, есть класс анализатора, в котором создаются потоки, и каждый из них вызывает через определённое время сигнал о том, что необходимо произвести анализ
То есть, всё построено на механизме сигналов-слотов

Но, при "большом" объёме сайтов (примерно 20-30) - прога заваливается, и либо не сканирует какие-то сайты, либо не работает вообще

И я не могу определить, в чём тут проблема!
То есть, если брать 5 +-5 сайтов, то работа стабильна, а чуть больше - глючит
Дело ли тут в том, что механизм сигналов-слотов даёт сбой, или где-то в алгоритме ошибка (но прога ведь не падает..)?

Отсюда вопросы:
1. Насколько надёжно, на Ваш взгляд, использование механизма сигналов-слотов
2. Насколько оно надёжно в приведённом случае
3. Насколько рнационален, на Ваш взгляд, предложенный мной подход к решению проблемы
4. Ну и вообще, Ваше мнение на сей счёт

Вопросов много накатал...
Буду рад, если кто-нибудь ответит smile
--------------------
stay true
PM MAIL WWW ICQ   Вверх
Artemon
Дата 22.10.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



А для чего использовать QWebPage ?

Если использовать Qt, то ябы сделал так: По количеству сайтов создалбы объекты QHttp запросы от данного объекта выполняются асинхронно и не блокирует основной поток. Поэтому запускаем получение данных, когда данные приходят - QHttp вызывает соответствующие слоты.

Далее вторая часть:

Из слота можно создавать поток, передавать в него полученный Html текст, запускать поток на выполнение и забывать о нем (конечноже не забыв сделать чтобы он атоматически удалялся для этот смотрим deleteLater).

Ну а в потоке делать уже парсинг и сохранение полученных данных в БД.


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

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

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


 




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


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

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