Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с QThreadPool 
:(
    Опции темы
necrom
Дата 23.7.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Народ подскажите как работать с QThreadPool, как потоку общаться по средствам сигналов с внешним миром?
Есть класс для потока

Код

#ifndef TCHECK_H
#define TCHECK_H

#include "Library.h"
#include "Function.h"
#include <QtCore/QRunnable>
#include <QtCore/QObject>

class CheckCms : public QObject
{
    Q_OBJECT

private:
    std::string checkurl;
public:
    CheckCms(std::string);
protected:
    void run();
signals:
    void AnswerCheck(const std::string&,bool);
};

#endif


И обращение к этому классу.

Код

 CheckCms *threadcms = new CheckCms(ret+append);
 connect(threadcms, SIGNAL(AnswerCheck(string,bool)) ,this, SLOT(AnswerCheck(string,bool)));
 QThreadPool::globalInstance()->start(threadcms);


Но данный код не работает, пишет ошибку на connect, что типо нет наследования от класса QObject. Если сделать наследование, то происходит ошибка при компиляции, т.к нельзя наследовать от этих двух классов одновременно.
Покажите пример, как правильно сделать.  smile 
И как сделать ограниченную очередь потоков,  чтоб например больше 20 не было пока один из потоков не умрёт.
PM MAIL   Вверх
borisbn
Дата 23.7.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(necrom @  23.7.2011,  18:15 Найти цитируемый пост)
Но данный код не работает, пишет ошибку на connect, что типо нет наследования от класса QObject.

странно... CheckCms наследован от QObject
Цитата(necrom @  23.7.2011,  18:15 Найти цитируемый пост)
class CheckCms : public QObject

а кто такой this в этой строке ?

Цитата(necrom @  23.7.2011,  18:15 Найти цитируемый пост)
connect(threadcms, SIGNAL(AnswerCheck(string,bool)) ,this, SLOT(AnswerCheck(string,bool)));

и ещё не понятно:
Цитата
QThreadPool::globalInstance()->start(threadcms);

threadcms должен быть наследником от QRunnable... такое не должно компилироваться

Цитата(necrom @  23.7.2011,  18:15 Найти цитируемый пост)
И как сделать ограниченную очередь потоков,  чтоб например больше 20 не было пока один из потоков не умрёт.

QThreadPool делает это сам. По-умолчанию он ограничивается количеством потоков, равным количеству ядер. Если нужно больше (хотя непонятно зачем...), то есть ф-ция
QThreadPool::setMaxThreadCount 



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


Шустрый
*


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

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



Извиняюсь не правильно написал, было вот так.
Код

class CheckCms : public QRunnable

Щяс в общем заработало, сделал так
Код

class CheckCms : public QObject,public QRunnable

именно в этом порядке, если в обратном, то компилятор ругается.
Ещё вот такой вопрос, если например при чтении из файла создаю n количество потоков, то когда он дойдёт до k, дальше он автоматически будет ожидать завершения одного из k-потоков, пока не освободится один из пула. N>K
Код

QThreadPool::setMaxThreadCount (k);
QThreadPool *threadPool = QThreadPool::globalInstance();
while (i <n){
    CheckCms *threadcms = new CheckCms(ret+append);
    threadcms->setAutoDelete(true);
    //Это для каждого потока связываю сигнал со внешним миром через слот.
    connect(threadcms, SIGNAL(AnswerCheck(string,bool)) ,this, SLOT(AnswerCheck(string,bool)),Qt::DirectConnection);
    threadPool->start(threadcms);
}
threadPool->waitForDone();


При задании значения setMaxThreadCount получаю ошибку компилятора.
Код


1> error C2352: 'QThreadPool::setMaxThreadCount' : illegal call of non-static member function
1>        c:\qt\4.5.0\include\qtcore\../../src/corelib/concurrent/qthreadpool.h(80) : see declaration of 'QThreadPool::setMaxThreadCount'


Это сообщение отредактировал(а) necrom - 24.7.2011, 03:00
PM MAIL   Вверх
borisbn
Дата 24.7.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



дык написано же
Цитата(necrom @  23.7.2011,  22:20 Найти цитируемый пост)
illegal call of non-static member function

Код

QThreadPool *threadPool = QThreadPool::globalInstance();
threadPool->setMaxThreadCount (k);



Это сообщение отредактировал(а) borisbn - 24.7.2011, 11:16


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


Шустрый
*


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

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



Спасибо, ступил )
А вот предыдущий вопрос.
Цитата

Ещё вот такой вопрос, если например при чтении из файла создаю n количество потоков, то когда он дойдёт до k, дальше он автоматически будет ожидать завершения одного из k-потоков, пока не освободится один из пула. N>K

PM MAIL   Вверх
borisbn
Дата 24.7.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(necrom @  23.7.2011,  22:20 Найти цитируемый пост)
Ещё вот такой вопрос, если например при чтении из файла создаю n количество потоков, то когда он дойдёт до k, дальше он автоматически будет ожидать завершения одного из k-потоков, пока не освободится один из пула. N>K

Цитата

void QThreadPool::start ( QRunnable * runnable, int priority = 0 )

Reserves a thread and uses it to run runnable, unless this thread will make the current thread count exceed maxThreadCount(). In that case, runnable is added to a run queue instead

другими словами - да smile


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


Шустрый
*


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

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



Спасибо.
Опять проблема, при исполнение программы в output получаю сообщение, что не может быть найден сигнал.
Код

Object::connect: No such signal CheckCms::AnswerCheck(string,bool)


Хотя всё описано и прописано, в чём может быть проблема подскажите?

Код

#ifndef TCHECK_H
#define TCHECK_H


#include <QtCore/QObject>
#include <QtCore/QRunnable>
#include "Function.h"

class CheckCms : public QObject,public QRunnable
{
    Q_OBJECT

private:
    std::string checkurl;
public:
    CheckCms(const std::string);
protected:
    void run();
signals:
    void AnswerCheck(const std::string&,bool);
};

#endif


Код

QThreadPool *threadPool = QThreadPool::globalInstance();
threadPool->setMaxThreadCount(allConfig.getThreads());
while (...){
 CheckCms *threadcms = new CheckCms(ret+append);
 connect(threadcms, SIGNAL(AnswerCheck(const string&,bool)) ,this,SLOT(AnswerCheckCMS(const string&,bool)),Qt::DirectConnection);
 threadcms->setAutoDelete(true);
 threadPool->start(threadcms);
}



P.s нашёл баг  нужно было  
Код

connect(threadcms, SIGNAL(AnswerCheck(const std::string&,bool)) ,this,SLOT(AnswerCheckCMS(const std::string&,bool)),Qt::DirectConnection);


Это сообщение отредактировал(а) necrom - 25.7.2011, 17:37
PM MAIL   Вверх
necrom
Дата 25.7.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё таки продолжу эту тему, как сделать ProgressBar в реальном времени на Qt?
Всё тот же класс и всё теже грабли )
Пробывал вешать дополнительный слот на каждый сигнал нити - эффект нулевой. Также пробывал добавлять непосредственно в сам слот обновление progressbar тоже не помогло (. В чём может быть проблема? Ещё хотел спросить, как можно обрабатывать сообщения из очереди?
Код

while (...){
 CheckCms *threadcms = new CheckCms(ret+append);
 connect(threadcms, SIGNAL(AnswerCheck(const string&,bool)) ,this,SLOT(AnswerCheckCMS(const string&,bool)),Qt::DirectConnection);
 connect(threadcms, SIGNAL(AnswerCheck(const std::string&,bool)) ,this, SLOT(GlProgressBar())); 
 threadcms->setAutoDelete(true);
 threadPool->start(threadcms);
}


Код

void GlProgressBar(){
    ui.progressBar->setValue(ui.progressBar->value()+1);
    QCoreApplication::processEvents();
}

void AnswerCheckCMS(const std::string& url,bool state){
    if (state){
        writeResult(url,allConfig.getoutcms().c_str());
    }
}


Это сообщение отредактировал(а) necrom - 25.7.2011, 23:54
PM MAIL   Вверх
borisbn
Дата 26.7.2011, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сигнатуры (список параметров) сигнала и слота должны совпадать.
Смотри, что пишется в окно Output


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

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

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


 




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


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

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