www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]該文章原創(chuàng)于Qter開源社區(qū)(www.qter.org),作者yafeilinux,轉(zhuǎn)載請注明出處! 導(dǎo)語 在前面的幾節(jié)內(nèi)容中講解了Qt網(wǎng)絡(luò)編程的一些基本內(nèi)容,這一節(jié)來看一下在Qt中進(jìn)程和

該文章原創(chuàng)于Qter開源社區(qū)(www.qter.org),作者yafeilinux,轉(zhuǎn)載請注明出處!

導(dǎo)語
在前面的幾節(jié)內(nèi)容中講解了Qt網(wǎng)絡(luò)編程的一些基本內(nèi)容,這一節(jié)來看一下在Qt中進(jìn)程和線程的基本應(yīng)用。
環(huán)境:Windows Xp + Qt 4.8.5+Qt Creator2.8.0


目錄
一、進(jìn)程 二、線程


正文

一、進(jìn)程 ? ??在設(shè)計一個應(yīng)用程序時,有時不希望將一個不太相關(guān)的功能集成到程序中,或者是因為該功能與當(dāng)前設(shè)計的應(yīng)用程序聯(lián)系不大,或者是因為該功能已經(jīng)可以使用現(xiàn)成的程序很好的實現(xiàn)了,這時就可以在當(dāng)前的應(yīng)用程序中調(diào)用外部的程序來實現(xiàn)該功能,這就會使用到進(jìn)程。Qt應(yīng)用程序可以很容易的啟動一個外部應(yīng)用程序,而且Qt也提供了在多種進(jìn)程間通信的方法。 ? ? Qt的QProcess類用來啟動一個外部程序并與其進(jìn)行通信。下面我們來看一下怎么在Qt代碼中啟動一個進(jìn)程。
1.首先創(chuàng)建QtGui應(yīng)用。 工程名稱為“myProcess”,其他選項保持默認(rèn)即可。
2.然后設(shè)計界面。 在設(shè)計模式往界面上拖入一個Push Button部件,修改其顯示文本為“啟動一個進(jìn)程”。
3.修改槽。 在按鈕上點擊鼠標(biāo)右鍵,轉(zhuǎn)到其clicked()信號對應(yīng)的槽,更改如下: void?MainWindow::on_pushButton_clicked() { ? ???myProcess.start("notepad.exe"); }
4.進(jìn)入mainwindow.h文件添加代碼。 先添加頭文件包含:#include ,然后添加私有對象定義:QProcess myProcess;
5.運行程序。 當(dāng)單擊界面上的按鈕時就會彈出一個記事本程序。
這里我們使用QProcess對象運行了Windows系統(tǒng)下的記事本程序(即notepad.exe程序),因為該程序在系統(tǒng)目錄中,所以這里不需要指定其路徑。大家也可以運行其他任何的程序,只需要指定其具體路徑即可。我們看到,可以使用start()來啟動一個程序,有時啟動一個程序時需要指定啟動參數(shù),這種情況在命令行啟動程序時是很常見的,下面來看一個例子,還在前面的例子的基礎(chǔ)上進(jìn)行更改。
1.在mainwindow.h文件中添加代碼。 添加私有槽: private?slots: ? ??void?showResult();
2.在mainwindow.cpp文件中添加代碼。
(1)先添加頭文件包含:#include ,然后在構(gòu)造函數(shù)中添加如下代碼: connect(&myProcess,SIGNAL(readyRead()), this, SLOT(showResult()));
(2)然后添加showResult()槽的定義: void?MainWindow::showResult() { ? ??qDebug() << "showResult: " << endl ? ?? ?? ?? ?< (3)最后將前面按鈕的單擊信號對應(yīng)的槽更改為: void?MainWindow::on_pushButton_clicked() { ? ??QString?program?=?"cmd.exe"; ? ??QStringList?arguments; ? ??arguments?< 3.?為了確保可以顯示輸出的中文字符,在main.cpp文件中添加代碼。 先添加頭文件包含#include ,然后在main()函數(shù)第一行代碼下面,添加如下一行代碼: QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
4.運行程序。 按下界面上的按鈕,會在Qt Creator中的應(yīng)用程序輸出欄中輸出命令的執(zhí)行結(jié)果。 ? ??對于Qt中進(jìn)程進(jìn)一步的使用可以參考QProcess類的幫助文檔。在Qt中還提供了多種進(jìn)程間通信的方法,大家可以在Qt幫助中查看Inter-ProcessCommunication in Qt關(guān)鍵字對應(yīng)的文檔。

二、線程 ? ? Qt提供了對線程的支持,這包括一組與平臺無關(guān)的線程類,一個線程安全的發(fā)送事件的方式,以及跨線程的信號-槽的關(guān)聯(lián)。這些使得可以很容易的開發(fā)可移植的多線程Qt應(yīng)用程序,可以充分利用多處理器的機(jī)器。多線程編程也可以有效的解決在不凍結(jié)一個應(yīng)用程序的用戶界面的情況下執(zhí)行一個耗時的操作的問題。關(guān)于線程的內(nèi)容,大家可以在Qt幫助中參考Thread Support in Qt關(guān)鍵字。
(一)啟動一個線程 ? ? Qt中的QThread類提供了平臺無關(guān)的線程。一個QThread代表了一個在應(yīng)用程序中可以獨立控制的線程,它與進(jìn)程中的其他線程分享數(shù)據(jù),但是是獨立執(zhí)行的。相對于一般的程序都是從main()函數(shù)開始執(zhí)行,QThread從run()函數(shù)開始執(zhí)行。默認(rèn)的,run()通過調(diào)用exec()來開啟事件循環(huán)。要創(chuàng)建一個線程,需要子類化QThread并且重新實現(xiàn)run()函數(shù)。 ? ??每一個線程可以有自己的事件循環(huán),可以通過調(diào)用exec()函數(shù)來啟動事件循環(huán),可以通過調(diào)用exit()或者quit()來停止事件循環(huán)。在一個線程中擁有一個事件循環(huán),可以使它能夠關(guān)聯(lián)其他線程中的信號到本線程的槽上,這使用了隊列關(guān)聯(lián)機(jī)制,就是在使用connect()函數(shù)進(jìn)行信號和槽的關(guān)聯(lián)時,將Qt::ConnectionType類型的參數(shù)指定為Qt::QueuedConnection。擁有事件循環(huán)還可以使該線程能過使用需要事件循環(huán)的類,比如QTimer和QTcpSocket類等。注意,在線程中是無法使用任何的部件類的。 ? ??下面來看一個在圖形界面程序中啟動一個線程的例子,在界面上有兩個按鈕,一個用于開啟一個線程,一個用于關(guān)閉該線程。
1.創(chuàng)建項目。 ? ? 新建Qt Gui應(yīng)用,名稱為“myThread”,類名為“Dialog”,基類選擇QDialog。
2.設(shè)計界面。 ? ??完成項目創(chuàng)建后進(jìn)入設(shè)計模式,向界面中放入兩個Push Button按鈕,將第一個按鈕的顯示文本更改為“啟動線程”,將其objectName屬性更改為startButton;將第二個按鈕的顯示文本更改為“終止線程”,將其objectName屬性更改為stopButton,將其enabled屬性取消選中。
3.添加自定義線程類。 ? ??向項目中添加新的C++類,類名設(shè)置為“MyThread”,基類設(shè)置為“QThread”,類型信息選擇“繼承自QObject”。完成后進(jìn)入mythread.h文件,先添加一個公有函數(shù)聲明: void stop(); 然后再添加一個函數(shù)聲明和一個變量的定義: protected: ? ? void?run(); private: ? ? volatile bool stopped; ? ??這里stopped變量使用了volatile關(guān)鍵字,這樣可以使它在任何時候都保持最新的值,從而可以避免在多個線程中訪問它時出錯。然后進(jìn)入mythread.cpp文件中,先添加頭文件#include ,然后在構(gòu)造函數(shù)中添加如下代碼: stopped = false; ? ? 這里將stopped變量初始化為false。下面添加run()函數(shù)的定義: void MyThread::run() { ? ? qreal i = 0; ? ? while (!stopped) ? ?? ???qDebug() << QString("in MyThread: %1").arg(i++); ? ? stopped = false; } ? ??這里一直判斷stopped變量的值,只要它為false,那么就一直打印字符串。下面添加stop()函數(shù)的定義: void MyThread::stop() { ? ? stopped = true; } ? ??在stop()函數(shù)中將stopped變量設(shè)置為了true,這樣便可以結(jié)束run()函數(shù)中的循環(huán),從而從run()函數(shù)中退出,這樣整個線程也就結(jié)束了。這里使用了stopped變量來實現(xiàn)了進(jìn)程的終止,并沒有使用危險的terminate()函數(shù)。
4.在Dialog類中使用自定義的線程。 先到dialog.h文件中,添加頭文件包含: #include "mythread.h" ? ??然后添加私有對象的定義: MyThread thread; ? ? 下面到設(shè)計模式,分別進(jìn)入兩個按鈕的單擊信號對應(yīng)的槽,更改如下:
// 啟動線程按鈕 void Dialog::on_startButton_clicked() { ? ? thread.start(); ? ? ui->startButton->setEnabled(false); ? ? ui->stopButton->setEnabled(true); }
// 終止線程按鈕 void Dialog::on_stopButton_clicked() { ? ? if (thread.isRunning()) { ? ?? ???thread.stop(); ? ?? ???ui->startButton->setEnabled(true); ? ?? ???ui->stopButton->setEnabled(false); ? ? } } ? ??在啟動線程時調(diào)用了start()函數(shù),然后設(shè)置了兩個按鈕的狀態(tài)。在終止線程時,先使用isRunning()來判斷線程是否在運行,如果是,則調(diào)用stop()函數(shù)來終止線程,并且更改兩個按鈕的狀態(tài)。現(xiàn)在運行程序,按下“啟動線程”按鈕,查看應(yīng)用程序輸出欄的輸出,然后再按下“終止線程”按鈕,可以看到已經(jīng)停止輸出了。 ? ??下面我們接著來優(yōu)化這個程序,通過信號和槽來將子線程中的字符串顯示到主界面上。
1.在mythread.h文件中添加信號的定義: signals: void stringChanged(const QString &);
2.然后到mythread.cpp文件中更改run()函數(shù)的定義: void?MyThread::run() { ? ??long?int?i?=?0; ? ??while?(!stopped)?{ ? ?? ??QString?str?=?QString("in?MyThread:?%1").arg(i); ? ?? ??emit?stringChanged(str); ? ?? ??msleep(1000); ? ?? ??i++; ? ??} ? ??stopped?=?false; } 這里每隔1秒就發(fā)射一次信號,里面包含了生成的字符串。
3.到dialog.h文件中添加槽聲明: private?slots: ? ??void?changeString(const?QString?&);
4.打開dialog.ui,然后向主界面上拖入一個Label標(biāo)簽部件。
5.到dialog.cpp文件中,在構(gòu)造函數(shù)里面添加信號和槽的關(guān)聯(lián): //?關(guān)聯(lián)線程中的信號和本類中的槽 connect(&thread,?SIGNAL(stringChanged(QString)), this, SLOT(changeString(QString)));
6.然后添加槽的定義: void?Dialog::changeString(const?QString?&str) { ? ??ui->label->setText(str); } ? ??這里就是將子線程發(fā)送過來的字符串顯示到主界面上?,F(xiàn)在可以運行程序,查看效果了。

(二)線程同步 ? ? Qt中的QMutex、QReadWriteLock、QSemaphore和QWaitCondition類提供了同步線程的方法。雖然使用線程的思想是多個線程可以盡可能的并發(fā)執(zhí)行,但是總有一些時刻,一些線程必須停止來等待其他線程。例如,如果兩個線程嘗試同時訪問相同的全局變量,結(jié)果通常是不確定的。QMutex提供了一個互斥鎖(mutex);QReadWriteLock即讀-寫鎖;QSemaphore即信號量;QWaitCondition即條件變量。
(三)可重入與線程安全 在查看Qt的幫助文檔時,在很多類的開始都寫著“All functions in this class are reentrant”,或者“All functions in this class are thread-safe”。在Qt文檔中,術(shù)語“可重入(reentrant)”和“線程安全(thread-safe)”用來標(biāo)記類和函數(shù),來表明怎樣在多線程應(yīng)用程序中使用它們: 一個線程安全的函數(shù)可以同時被多個線程調(diào)用,即便是這些調(diào)用使用了共享數(shù)據(jù)。因為該共享數(shù)據(jù)的所有實例都被序列化了。 一個可重入的函數(shù)也可以同時被多個線程調(diào)用,但是只能是在每個調(diào)用使用自己的數(shù)據(jù)時。

結(jié)語

最后要注意的是,使用線程是很容易出現(xiàn)問題的,比如無法在主線程以外的線程中使用GUI類的問題(可以簡單的通過這樣的方式來解決:將一些非常耗時的操作放在一個單獨的工作線程中來進(jìn)行,等該工作線程完成后將結(jié)果返回給主線程,最后由主線程將結(jié)果顯示到屏幕上)。大家應(yīng)該謹(jǐn)慎的使用線程。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉