Qt給定時器開線程及多線程下不同connect連接類型的分析

功能顯示界面

在這裏插入圖片描述

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所在線程運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章