MainEventsLoop в Qt библиотеке для не Qt приложения
От: qtprogger  
Дата: 03.06.20 16:57
Оценка:
Имеется класс Controller, который управляет некоторым воркерам Worker и используем логику взаимодействия на сигналах и слотах.
Насколько я понимаю, для того, чтобы это работало требуется QEventsLoop, который предоставляется QCoreApplication.

Controller нужно обернуть в свой класс и свою библиотеку. Как это правильно сделать?


Вот такое наивное решение попытался сделать: сунуть QAppliсation в std::tread. Возникло предупреждение " QApplication was not created in the main() thread.". При запуске сигналы и слоты не работают в библиотеке.
class Controller : public QObject
{
    Q_OBJECT
public:
    explicit Controller(QObject *parent = nullptr);
    int getNumber() {return mNumber;}
    void setPong(int n);

signals:
    void ping();

private:
    std::atomic<int> mNumber {0};
    Worker mWorker;
    QThread *mWorkerThread;
};

void MainEventLoopStart()
{
    int j = 0;
    char *c = nullptr;
    QCoreApplication app(j, &c);
    app.exec();
}

Controller::Controller(QObject *parent) : QObject(parent)
{
    std::thread th(MainEventLoopStart);
    th.detach();

    mWorkerThread = new QThread;
    mWorker.moveToThread(mWorkerThread);
    connect(mWorkerThread, &QThread::finished, &mWorker, &QObject::deleteLater);

    connect(this, &Controller::ping, &mWorker, &Worker::setPing);
    connect(&mWorker, &Worker::pong, this, &Controller::setPong);
    mWorkerThread->start();

    emit ping();
}


void Controller::setPong(int n)
{
    qDebug() << "setPong(" << n << ")";
    mNumber = n;
    if(mNumber<100) emit ping();
}


Класс библиотеки
class Qlibrary
{
public:
    Qlibrary();
    int getNumber();
private:
    Controller *mController;
};

Qlibrary::Qlibrary()
{
    mController = new Controller;
}


int Qlibrary::getNumber()
{
    return mController->getNumber();
}


Воркер
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    void pong(int);

public slots:
    void setPing();

private:
    int mBNumber {0};
};

Worker::Worker(QObject *parent) : QObject(parent) {}


void Worker::setPing()
{
    qDebug() << "setPing";
    QThread::usleep(100);
    mBNumber += 1;
    emit pong(mBNumber);
}
Отредактировано 03.06.2020 20:57 qtprogger . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.