Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6323
Последний выпуск: 19.06.2015

QThread бесконечные циклы

5.7K
07 сентября 2011 года
Lindemann66
193 / / 21.07.2011
Всем привет!

У меня такой, возможно, глупый вопрос
Следующий код:
Заголовочные файлы
Код:
//класс, выдающий сообщение в консоль
class Event {
public:
    void Show(QString str);
};

//класс главного потока
class MainThread {
private:
    Event *m_event;
public:
    MainThread();
    ~MainThread();
    void Run();
};

//класс второстепенного потока
class ChildThread : public QThread {
Q_OBJECT
private:
    Event *m_event;
    uint m_number;
public:
    void setNumber(uint number);
    void setEvent(Event *event);
    void run();
};


Реализация
Код:
#include "Classes.h"

void Event::Show(QString str) {
    qDebug() << str;
}

MainThread::MainThread() {
    m_event = new Event();
}

MainThread::~MainThread() {
    delete m_event;
}

void MainThread::Run() {
    for (int i = 0; i < 10; i++) {
        ChildThread child;
        child.setNumber(i);
        child.setEvent(m_event);
        child.run();
    }
}

void ChildThread::setNumber(uint number) {
    m_number = number;
}

void ChildThread::setEvent(Event *event) {
    m_event = event;
}

void ChildThread::run() {
    while (true) {
        m_event->Show(QString("Run from %1 thread").arg(m_number));

        sleep(3);
    }
}


Суть
Нужно создать определённое число потоков (10 в данном примере)
И вызывать внутри каждого некую операцию (в данном случае - qDebug)

Проблема
Программа доходит до бесконечного цикла первого потока, и в нём и остаётся

Как можно сделать так, чтобы проинициализировались все 10 бесконечных циклов, и продолжали работу?

Буду очень благодарен за любые ответы :)
5.7K
07 сентября 2011 года
Lindemann66
193 / / 21.07.2011
Почитав документацию, сделал так, как написано ниже:
Заголовочный файл
Код:
//класс, выдающий сообщение в консоль
class Event {
public:
    void Show(QString str);
};

//класс второстепенного потока
class ChildThread : public QThread {
Q_OBJECT
public:
    ChildThread(QObject *parent = 0);
    void setNumber(uint number);
    void setEvent(Event *event);
protected:
    void timerEvent(QTimerEvent *event);
private:
    Event *m_event;
    uint m_number;
};

//класс главного потока
class MainThread {
public:
    MainThread();
    ~MainThread();
    void Run();
private:
    Event *m_event;
    QList<ChildThread *> threads;
};


Реализация
Код:
void Event::Show(QString str) {
    qDebug() << str;
}

MainThread::MainThread() {
    m_event = new Event();
}

MainThread::~MainThread() {
    delete m_event;
    for (int i = 0; i < 3; i++) {
        delete threads;
    }
}

void MainThread::Run() {
    for (int i = 0; i < 3; i++) {
        ChildThread *child = new ChildThread();
        child->setNumber(i);
        child->setEvent(m_event);
        threads.push_back(child);
        child->start();
    }
}

ChildThread::ChildThread(QObject *parent) : QThread(parent) {
    startTimer(1000);
}

void ChildThread::setNumber(uint number) {
    m_number = number;
}

void ChildThread::setEvent(Event *event) {
    m_event = event;
}

void ChildThread::timerEvent(QTimerEvent *event) {
    m_number++;
    m_event->Show(QString("Run from %1 thread").arg(m_number));
}


Вопрос закрыт :)
277
07 сентября 2011 года
arrjj
1.7K / / 26.01.2011
Ну естественно, тыж через run() вызывал, а надо было через start(). И ещё сигналы/слоты лучше через emit вызывай, в одном потоке без разницы, а вот в многопоточном...
Чтиво для досуга:
http://doc.qt.nokia.com/latest/signalsandslots.html
http://doc.qt.nokia.com/latest/qobject.html#connect
http://doc.qt.nokia.com/latest/qt.html#ConnectionType-enum
5.7K
07 сентября 2011 года
Lindemann66
193 / / 21.07.2011
Спасибо :)
По поводу emit подумаю...
Дело в том...А какой класс будет обрабатывать сигнал?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог