- 論壇徽章:
- 0
|
Linux下Qt多線程編程
作者:武漢華嵌技術(shù)部
以下和大家分享Linux平臺(tái)下Qt兩種多線程編程的方式:
1、使用Linux平臺(tái)下的線程函數(shù)。以下是給出的代碼片段:
//此處為連接信號(hào)和槽,通過(guò)Qt界面中兩按鈕來(lái)控制兩個(gè)槽函數(shù)
connect(pthred1start, SIGNAL(clicked()), this, SLOT(pthread1start()));
connect(pthred1stop, SIGNAL(clicked()), this, SLOT(pthread1stop()));
/***************************linux平臺(tái)下的線程****************************/
//此函數(shù)為線程處理函數(shù)
void *mythread(void *arg)
{
Qt1 *tt = (Qt1 *)arg; //接收qt1的this指針
tt->i = 0;
while(1)
{
(tt->i)++;
qDebug()<<"i is : "<<tt->i;
//通過(guò)接收來(lái)的指針操作qt1的界面
tt->LeFirst->setText(QString::number(tt->i));
sleep(1);
}
}
void Qt1::pthread1start()
{
//在槽函數(shù)中通過(guò)Linux下的線程函數(shù)來(lái)創(chuàng)建一個(gè)線程,并且
//把Qt1中的this指針傳到線程函數(shù)中
int ret = pthread_create(&ptid, NULL, mythread, (void *)this);
if(ret != 0)
{
printf("wrong\n");
}
}
void Qt1::pthread1stop()
{
//關(guān)閉線程
pthread_cancel(ptid);
}
2、使用QT自帶的線程類(lèi)。以下是給出的代碼片段:
要使用QT自帶的線程類(lèi),來(lái)實(shí)現(xiàn)多線程編程,需要子類(lèi)化QThread,并且重新實(shí)現(xiàn)它的run()函數(shù)就可以了。如下所示:
//子類(lèi)化QThread
class myThread: public QThread
{
Q_OBJECT
public:
myThread(QWidget *parent = 0);
~myThread();
void run();
Qt1 *tt;
int i;
};
/*******************qt自帶線程*************************/
//子類(lèi)化QThread的構(gòu)造函數(shù)的實(shí)現(xiàn),并且對(duì)成員變量進(jìn)行初始化
myThread::myThread(QWidget *parent)
{
i = 0;
tt = (Qt1 *)parent;//保存qt1對(duì)象的this指針的值
}
myThread::~myThread()
{
}
/**************qt自帶線程start后,會(huì)自動(dòng)執(zhí)行run函數(shù)*********/
//重新實(shí)現(xiàn)QThread的run()函數(shù)
void myThread::run()
{
while(1)
{
(tt->i)++;
qDebug()<<"i is : "<<(tt->i);
//通過(guò)接收的this指針的值,來(lái)操作qt1對(duì)象的界面
tt->LeFirst->setText(QString::number(tt->i));
sleep(1);
}
}
以上是實(shí)現(xiàn)了自己的線程類(lèi),然后就如何使用了,使用如下:
在界面的構(gòu)造函數(shù)中有如下代碼:
//生成一個(gè)自己實(shí)現(xiàn)的qt中的線程類(lèi)對(duì)象
thread = new myThread(this);
//通過(guò)兩個(gè)控件來(lái)控制線程的開(kāi)始和結(jié)束
connect(qthreadstart, SIGNAL(clicked()), this, SLOT(pthread2start()));
connect(qthreadstop, SIGNAL(clicked()), this, SLOT(pthread2stop()));
void Qt1::pthread2start()
{
thread->start();//啟動(dòng)qt線程
}
void Qt1::pthread2stop()
{
thread->terminate();//停止qt線程
}
注意:
以上都只是給出了線程的使用,但是,在程序中如何使用得視情況而定。
更多技術(shù)文章敬請(qǐng)關(guān)注:武漢華嵌-嵌入式培訓(xùn)專(zhuān)家,國(guó)內(nèi)領(lǐng)先的嵌入式服務(wù)機(jī)構(gòu),
http://www.embedhq.org |
|