功能顯示界面
Qt給定時器開線程
定義定時器和子線程
timerthread.h中:
class TimerThread : public QMainWindow
{
Q_OBJECT
public:
TimerThread(QWidget *parent = 0);
~TimerThread();
private slots:
void on_btnStart_clicked();
void on_btnStop_clicked();
void on_btnClear_clicked();
void timeroutSlot();
private:
Ui::TimerThreadClass ui;
QTimer* mTimer;
QThread* mTimerThread;
};
定時器和子線程槽函數的實現
#include "timerthread.h"
TimerThread::TimerThread(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
setWindowTitle(QStringLiteral("定時器線程"));
mTimer = new QTimer;
mTimerThread = new QThread;
mTimer->setInterval(1000);
mTimer->moveToThread(mTimerThread);
connect(mTimerThread, SIGNAL(started()), mTimer, SLOT(start()));
connect(mTimer, SIGNAL(timeout()), this, SLOT(timeroutSlot()), Qt::DirectConnection);
}
TimerThread::~TimerThread()//
{
}
void TimerThread::on_btnStart_clicked()
{
int id = (int)QThread::currentThreadId();
QString str = "GUI_Thread_id: " + QString::number(id);
ui.textBrowser->append(str);
if (!mTimerThread->isRunning())
{
mTimerThread->start();
}
}
void TimerThread::on_btnStop_clicked()
{
int id = (int)QThread::currentThreadId();
QString str = "GUI_Thread_id: " + QString::number(id);
ui.textBrowser->append(str);
if (mTimerThread->isRunning())
{
mTimerThread->quit();
mTimerThread->wait();
}
}
void TimerThread::on_btnClear_clicked()
{
ui.textBrowser->clear();
}
void TimerThread::timeroutSlot()
{
static int cnt = 0;
cnt = (cnt <= 100) ? ++cnt : 1;
int id = (int) QThread::currentThreadId();
QString str = "Slot_Thread_id: " + QString::number(id);
ui.textBrowser->append(str);
str.clear();
str = "Number: " + QString::number(cnt);
ui.textBrowser->append(str);
}
不同信號槽connect連接類型的功能:
Qt的多線程信號槽connect連接方式:
Qt::AutoConnection:默認值。如果接收者處於發出信號的線程中,則使用Qt::DirectConnection,否則使用Qt::QueuedConnection,連接類型由發出的信號決定。
Qt::DirectConnection:信號發出後立即調用槽函數,槽函數在發出信號的線程中執行。
Qt::QueuedConnection:控制權返回給接收者所在的事件循環中時,開始調用槽函數。槽函數在接收者的線程中執行。
因此,connect語句可以更改爲:
a) Qt::AutoConnection連接方式(默認)下:
connect(mTimer, SIGNAL(timeout()), this, SLOT(timeroutSlot()));
結果爲:
可見:默認的連接方式,選擇的Qt::QueuedConnection,即,槽函數在接收者所在線程執行。
b) Qt::DirectConnection連接方式:
// 指明連接方式
connect(mTimer, SIGNAL(timeout()), this, SLOT(timeroutSlot()), Qt::DirectConnection);
結果爲:
可見,Qt::DirectConnection連接方式,槽函數,選擇的是在信號發出者所在線程執行的。
總結三種連接方式:
對於connect:
connect(sender,signal1,receiver,slot1);
三種連接方式:
Qt::AutoConnection(默認):
若receiver在sender線程中,slot1選擇Qt::DirectConnection方式;否則,選擇Qt::QueuedConnection方式;
**Qt::QueuedConnection:**指定slot1在receiver所在線程運行;
**Qt::DirectConnection:**指定slot1在sender所在線程運行。