Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2011, 11:10   #1
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
Стрелка Надёжность сигналов-слотов

Всем привет!

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

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

Важно другое

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

Уже пробовал создавать отдельный поток под каждый сайт, но проблема в том, что сканирование сайтов (читай - использование 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. Ну и вообще, Ваше мнение на сей счёт

Вопросов много накатал...
Буду рад, если кто-нибудь ответит
Lindemann66 вне форума Ответить с цитированием
Старый 18.10.2011, 17:28   #2
V@Programmer
На форуме меня нет
Пользователь
 
Аватар для V@Programmer
 
Регистрация: 03.08.2011
Сообщений: 56
По умолчанию

Абсолютно надёжно! В приведенном случае тоже все стабильно. Ну вообще-то не очень то рационально. Можно загружать версии сайтов раз в неделю и делать это в фоне а всю неделю (например до воскресения) делать проверку исходного кода страниц
ПСЕВДОКОД:
ЕСЛИ (КОД == КОД_2) ТОГДА
ВЫВЕСТИ НЕОБНОВЛЁН
В ПРОТИВНОМ СЛУЧАЕ
ВЫВЕСТИ ОБНОВЛЁН
Делаю бд, программы,
icq 640743615 дамы!
V@Programmer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация сигналов USB Krasi Общие вопросы C/C++ 4 10.05.2011 09:31
обработка сигналов Yelisey Общие вопросы C/C++ 1 01.05.2011 01:09
Генерация звуковх сигналов Krizzly Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 15.12.2010 13:47
Спектральный анализ и фильтрация сигналов John777 Помощь студентам 0 22.04.2009 00:06