如何用frontpage做網(wǎng)站seo快速優(yōu)化文章排名
【QT5-自我學(xué)習(xí)-線程qThread移植與使用-通過(guò)代碼完成自己需要功能-移植小記3】
- 1、前言
- 2、實(shí)驗(yàn)環(huán)境
- 3、自我總結(jié)
- (1)文件的編寫
- (2)信號(hào)與槽的新理解
- (3)線程數(shù)據(jù)的傳遞
- 4、移植步驟
- 第一步:添加新文件
- 第二步:初始化線程與連接內(nèi)容
- 第四步:編寫線程文件與自定義內(nèi)容
- 第五步:補(bǔ)充其它內(nèi)容
- 5、實(shí)驗(yàn)代碼-無(wú)
- 6、細(xì)節(jié)部分
- (1)各種報(bào)錯(cuò)
- (2)undefined reference to。。。
- (3)缺少“Q_OBJECT”關(guān)鍵字
- 7、總結(jié)
1、前言
學(xué)習(xí)線程其實(shí)有一段時(shí)間了,當(dāng)時(shí)只是學(xué)習(xí),沒(méi)有實(shí)際用起來(lái),最近做的一個(gè)qt程序,發(fā)現(xiàn)如果不使用線程,那么就會(huì)導(dǎo)致界面卡死,這樣才體現(xiàn)出線程的實(shí)際作用。
這里是第三章,主要是說(shuō)明如何使用移植,如何嵌入到自己項(xiàng)目中。
并且開(kāi)啟本章前,默認(rèn)你已經(jīng)至少練習(xí)了一種線程使用方式,如果你練了,那么移植也是非常簡(jiǎn)單。
2、實(shí)驗(yàn)環(huán)境
實(shí)驗(yàn)環(huán)境還是挺重要的,因?yàn)橛袝r(shí)候,在你電腦上能運(yùn)行的東西,在別人的電腦就不一定能運(yùn)行,這一部分的原因就可能是實(shí)驗(yàn)版本不一樣。
系統(tǒng)環(huán)境:window環(huán)境
QT軟件版本:qt 5.14.2
3、自我總結(jié)
(1)文件的編寫
移植的話,如果我們想套在自己的程序上,其實(shí)主要兩個(gè)部分的編寫,更準(zhǔn)確的是兩個(gè)文件編寫。
1、一部分就是線程文件:對(duì)于線程文件,我們需要自己知道,哪里是線程需要外殼,哪里是自己想要跑得程序庫(kù)內(nèi)容。
如下舉例,在run內(nèi)里內(nèi)容,就是咱們自己移植后,需要替換的內(nèi)容,這里需要我們自己跑自己內(nèi)容。
2、另一部分就是主線程文件:在本例中,就是mainwindow.cpp內(nèi)容,里面主要是連接“connect”,將函數(shù)信號(hào)槽等連接起來(lái),這樣我們點(diǎn)擊按鍵才會(huì)觸發(fā)相應(yīng)函數(shù)。
(2)信號(hào)與槽的新理解
這里算是我自己的一個(gè)新理解,我自己在移植的時(shí)候,其實(shí)在按鍵里寫其他功能內(nèi)容,同樣移植的時(shí)候,就復(fù)制了這部分內(nèi)容。但是實(shí)際調(diào)用功能時(shí),沒(méi)有點(diǎn)擊按鍵,結(jié)果就是咋整,都進(jìn)不去線程。
用文字描述還是有點(diǎn)抽象,這里如下代碼舉例、
.....connect(ui->pushButton,&QPushButton::clicked,this,[=](){//發(fā)送信號(hào)emit starting(10000);//啟動(dòng)線程gen->start();});
......void MainWindow::on_pushButton_clicked()
{......
}
如上,如果我在主界面直接點(diǎn)擊按鍵,是一定可以觸發(fā)函數(shù) >>on_pushButton_clicked() 和 開(kāi)啟線程的。
因?yàn)榘存I會(huì)觸發(fā)一個(gè)clicked信號(hào)。
但是我實(shí)際應(yīng)用時(shí),也是這樣寫的,但是我不會(huì)去點(diǎn)擊這個(gè)按鍵,而是使用軟件代碼去調(diào)用函數(shù)>>on_pushButton_clicked() ,這樣雖然函數(shù)會(huì)執(zhí)行,但是不會(huì)開(kāi)啟線程,因?yàn)闆](méi)有clicked信號(hào)。
這對(duì)我這樣的新手來(lái)說(shuō),是一次認(rèn)知小提升,以前聽(tīng)到理論是提到信號(hào)和槽可以分開(kāi)的,但是用久了,都是一個(gè)信號(hào)一個(gè)槽,會(huì)自然認(rèn)為他們是一體的,沒(méi)想過(guò)要看成兩個(gè)獨(dú)立東西。
(3)線程數(shù)據(jù)的傳遞
另外另外一點(diǎn)是線程之間傳遞數(shù)據(jù)的方式,開(kāi)始自己不太會(huì)的話,可以使用全局變量,但是按照作者的教學(xué),其實(shí)用跟簡(jiǎn)單的方式,這塊我著暫時(shí)沒(méi)有深入更多,但以后需要的話,還是需要自己仔細(xì)研究下。
4、移植步驟
這里大概講講移植需要做的事情,以供參考。
第一步:添加新文件
在自己工程加入新的.cpp和.h文件
用來(lái)盛放我們自己功能函數(shù)與線程這層外殼。
第二步:初始化線程與連接內(nèi)容
這里主要是mainwindow.cpp內(nèi)容,這些函數(shù)完全可以封裝一下,只要是連接線程作用。
第四步:編寫線程文件與自定義內(nèi)容
回到線程函數(shù),我們將線程內(nèi)容填寫完,同時(shí)寫好自己需要內(nèi)容。
第五步:補(bǔ)充其它內(nèi)容
當(dāng)然還有其它內(nèi)容需要補(bǔ)充下,比如一些包含文件,一些聲明等。
5、實(shí)驗(yàn)代碼-無(wú)
本次無(wú)實(shí)驗(yàn)代碼,主要是內(nèi)容講解。
6、細(xì)節(jié)部分
自己調(diào)試過(guò)程中,或者說(shuō)移植過(guò)程中還是遇到了一些問(wèn)題的,將其記錄下來(lái)。
(1)各種報(bào)錯(cuò)
當(dāng)時(shí)報(bào)錯(cuò)的時(shí)候,真是一臉懵逼,完全不知道為啥,看代碼就定位到447行,查看很久才知道,AexplicitA,就是自己失誤打上去的,后來(lái)刪除后,相繼問(wèn)題就沒(méi)有,真的很神奇,自己都不知道咋打上去的。
(2)undefined reference to。。。
簡(jiǎn)單說(shuō),就是沒(méi)有定義fnSend這個(gè)函數(shù),這個(gè)好像和上一個(gè)問(wèn)題一樣的,在關(guān)鍵文件打錯(cuò)了,連帶的,后續(xù)就沒(méi)有了。
(3)缺少“Q_OBJECT”關(guān)鍵字
7、總結(jié)
這樣線程也可以告一段落了,等使用的時(shí)候,添加進(jìn)來(lái)就可以。