作者:武漢華嵌嵌入式培訓中心 技術部
以下和大家分享Linux平台下Qt兩種多線程編程的方式:
1、使用Linux平台下的線程函數。以下是給出的程式碼片段:
//此處為串連訊號和槽,通過Qt介面中兩按鈕來控制兩個槽函數
connect(pthred1start, SIGNAL(clicked()), this, SLOT(pthread1start()));
connect(pthred1stop, SIGNAL(clicked()), this, SLOT(pthread1stop()));
/***************************linux平台下的線程****************************/
//此函數為線程處理函數
void *mythread(void *arg)
{
Qt1 *tt = (Qt1 *)arg; //接收qt1的this指標
tt->i = 0;
while(1)
{
(tt->i)++;
qDebug()<<"i is : "<<tt->i;
//通過接收來的指標操作qt1的介面
tt->LeFirst->setText(QString::number(tt->i));
sleep(1);
}
}
void Qt1::pthread1start()
{
//在槽函數中通過Linux下的線程函數來建立一個線程,並且
//把Qt1中的this指標傳到線程函數中
int ret = pthread_create(&ptid, NULL, mythread, (void *)this);
if(ret != 0)
{
printf("wrong\n");
}
}
void Qt1::pthread1stop()
{
//關閉線程
pthread_cancel(ptid);
}
2、使用QT內建的線程類。以下是給出的程式碼片段:
要使用QT內建的線程類,來實現多線程編程,需要子類化QThread,並且重新實現它的run()函數就可以了。如下所示:
//子類化QThread
class myThread: public QThread
{
Q_OBJECT
public:
myThread(QWidget *parent = 0);
~myThread();
void run();
Qt1 *tt;
int i;
};
/*******************qt內建線程*************************/
//子類化QThread的建構函式的實現,並且對成員變數進行初始化
myThread::myThread(QWidget *parent)
{
i = 0;
tt = (Qt1 *)parent;//儲存qt1對象的this指標的值
}
myThread::~myThread()
{
}
/**************qt內建線程start後,會自動執行run函數*********/
//重新實現QThread的run()函數
void myThread::run()
{
while(1)
{
(tt->i)++;
qDebug()<<"i is : "<<(tt->i);
//通過接收的this指標的值,來操作qt1對象的介面
tt->LeFirst->setText(QString::number(tt->i));
sleep(1);
}
}
以上是實現了自己的線程類,然後就如何使用了,使用如下:
在介面的建構函式中有如下代碼:
//產生一個自己實現的qt中的線程類對象
thread = new myThread(this);
//通過兩個控制項來控制線程的開始和結束
connect(qthreadstart, SIGNAL(clicked()), this, SLOT(pthread2start()));
connect(qthreadstop, SIGNAL(clicked()), this, SLOT(pthread2stop()));
void Qt1::pthread2start()
{
thread->start();//啟動qt線程
}
void Qt1::pthread2stop()
{
thread->terminate();//停止qt線程
}
注意:
以上都只是給出了線程的使用,但是,在程式中如何使用得視情況而定。