728x90

기본적으로 QTimer를 만들고 timeout Singal을 connect 해준다면 Main Thread에서 Slot이 처리됩니다. 이럴 때 QThread를 생성 후 Timer를 그 쓰레드로 이동시켜 사용한다면 Main Thread가 아닌 생성한 Thread에서 처리가 됩니다.

class timerMgr : public QObject {
    Q_OBJECT
public:
    timerMgr() {
        for ( int i=0; i < 3 ; i++ ) {
            QTimer* t = new QTimer;
            t->setObjectName("Timer" + QString::number(i));
            t->setInterval(QRandomGenerator::global()->bounded(100, 2000));
            connect ( t, &QTimer::timeout, this, &timerMgr::printTimer);
            timerList.append(t);
        } // 랜덤 주기의 Timer를 생성하고 Connect
    }

    void startTimer() {
        for ( auto t : timerList ) {
            t->start();
        }
    }

private slots:
    void printTimer() {
        qDebug() << "Timeout Thread = " << QThread::currentThreadId();
    } // Thread ID 출력

private:
    QList<QTimer*> timerList;
};


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug() << "Main Thread = " << QThread::currentThreadId();
    QThread* TimerThread = new QThread;		// Thread 생성
    timerMgr* t = new timerMgr;	
    t->moveToThread(TimerThread);			// Timer Manager 클래스를 TimerThread에서 돌게
    TimerThread->start();					// Timer Thread Start

    t->startTimer();
}

MainWindow::~MainWindow()
{
    delete ui;
}

위 코드를 실행하면 아래와 같이 Timeout에 대한 Slot 함수가 다른 Thread에서 발생했다는 것을 볼 수 있습니다.

더보기

실행결과

 

Main Thread =  0x52f8
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c
Timeout Thread =  0x638c

728x90

+ Recent posts