QThread бесконечные циклы
У меня такой, возможно, глупый вопрос
Следующий код:
Заголовочные файлы
Код:
//класс, выдающий сообщение в консоль
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();
};
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);
}
}
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 бесконечных циклов, и продолжали работу?
Буду очень благодарен за любые ответы :)
Заголовочный файл
Код:
//класс, выдающий сообщение в консоль
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;
};
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));
}
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));
}
Вопрос закрыт :)
Ну естественно, тыж через run() вызывал, а надо было через start(). И ещё сигналы/слоты лучше через emit вызывай, в одном потоке без разницы, а вот в многопоточном...
По поводу emit подумаю...
Дело в том...А какой класс будет обрабатывать сигнал?