Параллельные потоки в qt



  • Здравствуйте! Я новичок в 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.
    Очень прошу, объясните мне пожалуйста, как добиться их параллельной работы?
    Заранее спасибо!



  • Вы сначала подключаете сигнал потока started к слоту первого объекта. По умолчанию используется Qt::QuedConnection, это говорит о том что слот выполнится в контексте СВОЕГО потока, а не потока сигнала.
    У вас два объекта живут в контексте main-потока, когда запускается первый поток - вызывается слот первого объекта в main потоке и блокирует его (у вас же там бесконечный) цикл.
    Объект, принимающий сигнал, должен быть создан в контексте другого потока или перемещён туда с помощью moveToThread()
    Для изучения Вы можете следит за QThread::currentThreadID (вроде так), и будете понимать в каком потоке какая у вас функция работает.



  • Спасибо за объяснение, я Вас понял, я добавил moveToThread() перед connect() мне это не помогло, наверное, делаю что то не так. Я попробовал вариант, когда наследуется класс от QThread и в его методе run выполняется нужная функция. В этом случае потоки выполняются параллельно, но мне этот вариант с точки зрения ООП не очень...
    Буду благодарен за советы!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.