功能显示界面
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所在线程运行。