#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()));
}