QThread, посвященный бесконечному циклу

#c #qt

#c #qt

Вопрос:

Итак, я хочу создать отдельный поток для моего бесконечного цикла while. Как исправить приведенный ниже код, чтобы он не прерывал соединение с сигнальным слотом?

 #include "gameloop.h"

GameLoop::GameLoop(QObject *parent) : QObject(parent)
{
    timer = new QTimer;
    connect(timer, SIGNAL(timeout()), this, SLOT(mySlot()));
    timer->start(500);
    thread = new QThread();
    console = new Console;
    console->moveToThread(thread);
    thread->start();

    run();
}

GameLoop::~GameLoop()
{
    std::cout << "GameLoop() Destructor" << "n";
}

void GameLoop::run()
{
     console->loop();
}



void GameLoop::mySlot()
{
    std::cout << "mySlot" << "n";
}
  

Функция-член loop() в консоли класса содержит while(1).

Комментарии:

1. попробуйте изменить run(); на QTimer::singleShot(0, this, amp;GameLoop::run); и пусть это run() будет слот.

2. Но меня интересует, почему бесконечный цикл в отдельном потоке все еще нарушает работу системы слотов сигналов.

3. Я не знаю, о чем вы говорите.

4. Я хотел спросить, почему в приведенном выше коде QTimer запускает mySlot, когда закомментировано значение console-> loop();. Разве помещение чего-либо в отдельный поток не дает ему «собственную жизнь»? Тем не менее, вызов console-> loop() предотвращает запуск mySlot

5. Заключается в том, что метод run выполняется не в потоке, где находится GameLoop, а в потоке, где был создан GameLoop, что сильно отличается, поскольку вы используете moveToThread. Я предполагаю, что игровой цикл был создан в основном потоке, поэтому метод run блокирует цикл событий, цикл событий Qt — это то, что позволяет управлять сигналами, таймерами, событиями и т.д. По этой причине это не работает, вместо этого, по моему предложению, метод run будет выполняться в потоке, где находится GameLoop. Вы пробовали мое предложение?

Ответ №1:

Решение, которое решило мою проблему, заключается в следующем в приведенном ниже коде, таким образом, бесконечный цикл находится в потоке, предназначенном для него:

 #include "gameloop.h"
#include <QThread>
GameLoop::GameLoop(QObject *parent) : QObject(parent)
{
    std::cout << "GameLoop thread: " << QThread::currentThreadId()  << "n";
    timer = new QTimer;
    timer->start(3000);
    connect(timer, SIGNAL(timeout()), this, SLOT(mySlot())); //timers

    thread1 = new QThread;

    console.moveToThread(thread1);
    thread1->start();
    connect(thread1, SIGNAL(started()), amp;console, SLOT(mySlotActivationLoop()));
}