Russian Qt Forum
Апрель 26, 2024, 07:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Параллельные потоки в QT.  (Прочитано 3089 раз)
infernalcucumber
Гость
« : Июль 27, 2016, 13:12 »

Здравствуйте! Я новичок в QT,ранее почти не работал с потоками, хотелось бы навести справки как правильно пользоваться потоками,параллельно, прочитал достаточно много, каша в голове, усвоить пока не получается...

Вот пример: есть класс identificator, .h:

Код:
class identificator:public QObject {
Q_OBJECT
public:
    identificator();
    virtual ~identificator();
private:
int id;
private slots:
void printID();
public:
void setID(int i);
int getID();
signals:
void finished();
};
.cpp:

Код:
#include "identificator.h"
#include <stdio.h>
identificator::identificator() {
id=0;
}
 
identificator::~identificator() {
    // TODO Auto-generated destructor stub
}
void identificator::setID(int i)
{
id=i;
}
int identificator::getID()
{
return id;
}
void identificator::printID()
{
for(;;)
{
printf("%d\n",this->getID());
}
emit finished();
}

а вот main.cpp:

Код:
#include <QtCore>
#include <QCoreApplication>
#include <QApplication>
#include "myThread.h"
#include "identificator.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    printf("Hello\n");
    identificator *first=new identificator();
    identificator *second=new identificator();
    QThread *thread1=new QThread;
    QThread *thread2=new QThread;
    first->setID(3);
    second->setID(4);
    QObject::connect(thread1, SIGNAL(started()), first, SLOT(printID()));
    QObject::connect(thread2, SIGNAL(started()), second, SLOT(printID()));
    QObject::connect(first, SIGNAL(finished()), thread1, SLOT(quit()));
    QObject::connect(second, SIGNAL(finished()), thread2, SLOT(quit()));
    thread1->start();
    thread2->start();
    return a.exec();
}

Ожидаю, что в консоль будет выводится числа 3 и 4, вразнобой,бесконечно долго, но при запуске в консоль выводится только 3.
Очень прошу, объясните мне пожалуйста, как добиться их параллельной работы?
Заранее спасибо!
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 27, 2016, 13:40 »

В такой функции будет постоянно, полностью загружая проц выводиться запись в консоль и никогда не вызовется сигнал finished, потому что:
* цикл бесконечный
* выхода из него нет: break, return, goto

Код
C++ (Qt)
void identificator::printID()
{
for(;;)
{
printf("%d\n",this->getID());
}
emit finished();
}
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 27, 2016, 14:03 »

Код:
Qbject::connect(thread1, SIGNAL(started()), first, SLOT(printID()));
QObject::connect(thread2, SIGNAL(started()), second, SLOT(printID()));
QObject::connect(first, SIGNAL(finished()), thread1, SLOT(quit()));
QObject::connect(second, SIGNAL(finished()), thread2, SLOT(quit()));
thread1->start();
thread2->start();
return a.exec();
}
Происходит следующее:

- главная нитка запустила thread1 и thread2 и ушла на ожидание событий в exec().

- thread1 испустила сигнал started, но он сначала помещается в очередь EventLoop главной нитки

- главная  извлекает started из своего EventLoop и начинает печатать тройку

- thread2 тоже испустила сигнал started, он тоже сначала помещается в очередь EventLoop главной нитки - но до его извлечения дело не доходит - ведь главная печатает тройки
Записан
Bepec
Гость
« Ответ #3 : Июль 27, 2016, 15:10 »

А я ещё больше скажу, что даже избавься от цикла ничего в параллельных потоках работать не будет Веселый
Ибо коннект будет queued и все ваши слоты будут выполняться в главном потоке.
Да и объекты с этими слотами опять таки в главном потоке.
Да и вообще у вас всё в главном потоке Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 27, 2016, 15:30 »

А я ещё больше скажу, ...
А может не надо?  Улыбающийся

Чтобы печатать 3 и 4 добавьте 2 строки
Код
C++ (Qt)
first->setID(3);
second->setID(4);
first->moveToThread(thread1);
second->moveToThread(thread2);
Записан
Bepec
Гость
« Ответ #5 : Июль 27, 2016, 16:31 »

Igors это как минимум странно.
Ставить под сомнение мой комментарий и сразу же добавлять решение выходящее из моего комментария Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 22.