Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность[Qt], распараллеливание программы 
V
    Опции темы
ss
Дата 11.10.2015, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.
Пытаюсь распареллелить программу на примере http://habrahabr.ru/post/150274/
есть класс WorkerFilter который будет работать в потоке

WorkerFilter 
Код

class WorkerFilter : public QObject
{
    Q_OBJECT
public:
    explicit WorkerFilter(QObject *parent = 0);
    void init();
signals:
    void finish();
public slots:
    void work();
};
//-------------------------------------------------
void WorkerFilter::work()
{
    emit finish();
}


и класс фабрика которая буде порождать потоки
Filter.h
Код

class Filter : public QObject
{
    Q_OBJECT
public:
    explicit Filter(QObject *parent = 0);
    void start();

signals:
    void finish();

public slots:
    void slotFinish();

private:
    QVector<QThread*> thrs;
    QVector<WorkerFilter*> workers;
    quint8 cores;
    quint8 countFinish;
};


Filter.cpp
Код

Filter::Filter(QObject *parent) : QObject(parent)
{
    cores = omp_get_max_threads();
    thrs.resize(cores );
    workers.resize(cores );

    for(quint8 i = 0; i < cores; ++i)
    {
        thrs[i] = new QThread;
        workers[i] = new WorkerFilter;
        workers[i]->moveToThread(thrs[i] );
        connect(thrs[i], SIGNAL(started()), workers[i], SLOT(work()) );

        connect(workers[i], SIGNAL(finish()), this, SLOT(slotFinish()) );

    }

}

void Filter::start()
{
    countFinish = 0;
    for(quint8 i = 0; i < cores; ++i)
    {
        thrs[i]->start();
    }
}

void Filter::slotFinish()
{
    if (countFinish < cores)
    {
        ++ countFinish;
    }else
    {
        emit finish();
        qDebug()<<"фабрика завершена";
    }
}



создаю фабрику и запускаю
 Filter f;
    f.start();

она начинает работать. Создаются потоки Они работают. выдают сигнал emit finish() из void WorkerFilter::work() а вот вызов Filter::slotFinish() не срабатывает. В чем причина, подскажите?

в  Filter::slotFinish() должен настираться счетчик countFinish до количества выделенных потоков и выдать сигнал о завершении работыemit finish(); 
PM MAIL   Вверх
math64
Дата 12.10.2015, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



попробуй при коннекте задать правильный ConnectionType. AutoConnection, выбираемый по умолчанию, не подходит.
PM   Вверх
borisbn
Дата 12.10.2015, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1) Что пишется в окне Output в отладчике ?
2) Мне кажется, что ты QtConcurrent изобретаешь...


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


Шустрый
*


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

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



Цитата

Что пишется в окне Output в отладчике


ничего. Все срабатывает нормально. Завершается без ошибок. Потоки заходят в WorkerFilter::work() а в Filter::slotFinish сигнал не проходит

Цитата

 Мне кажется, что ты QtConcurrent изобретаешь... 


может и его. Просто, с QtConcurrent еще не сталкивался. 

Цитата

попробуй при коннекте задать правильный ConnectionType. AutoConnection, выбираемый по умолчанию, не подходит. 


пробовал Qt::BlockingQueuedConnection и Qt::QueuedConnection все равно не заходит

Это сообщение отредактировал(а) ss - 12.10.2015, 21:50
PM MAIL   Вверх
Guinness
Дата 13.10.2015, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ss @  11.10.2015,  21:37 Найти цитируемый пост)
создаю фабрику и запускаю
 Filter f;
    f.start();

Приведите часть кода, где Вы это делаете. 
PM MAIL   Вверх
ss
Дата 13.10.2015, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Guinness, спасибо за помощь. 
что-то я вообще.  Описал  в конструкторе как локальную переменную.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
  Filter f;
  f.start();
}


вынес объявление экземпляра класса f в параметр класса MainWindow и все заработало.

Это сообщение отредактировал(а) ss - 13.10.2015, 21:06
PM MAIL   Вверх
math64
Дата 14.10.2015, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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


 




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


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

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