女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

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

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

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


目錄
一、進程 二、線程


正文

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

二、線程 ? ? Qt提供了對線程的支持,這包括一組與平臺無關的線程類,一個線程安全的發(fā)送事件的方式,以及跨線程的信號-槽的關聯(lián)。這些使得可以很容易的開發(fā)可移植的多線程Qt應用程序,可以充分利用多處理器的機器。多線程編程也可以有效的解決在不凍結一個應用程序的用戶界面的情況下執(zhí)行一個耗時的操作的問題。關于線程的內容,大家可以在Qt幫助中參考Thread Support in Qt關鍵字。
(一)啟動一個線程 ? ? Qt中的QThread類提供了平臺無關的線程。一個QThread代表了一個在應用程序中可以獨立控制的線程,它與進程中的其他線程分享數(shù)據(jù),但是是獨立執(zhí)行的。相對于一般的程序都是從main()函數(shù)開始執(zhí)行,QThread從run()函數(shù)開始執(zhí)行。默認的,run()通過調用exec()來開啟事件循環(huán)。要創(chuàng)建一個線程,需要子類化QThread并且重新實現(xiàn)run()函數(shù)。 ? ??每一個線程可以有自己的事件循環(huán),可以通過調用exec()函數(shù)來啟動事件循環(huán),可以通過調用exit()或者quit()來停止事件循環(huán)。在一個線程中擁有一個事件循環(huán),可以使它能夠關聯(lián)其他線程中的信號到本線程的槽上,這使用了隊列關聯(lián)機制,就是在使用connect()函數(shù)進行信號和槽的關聯(lián)時,將Qt::ConnectionType類型的參數(shù)指定為Qt::QueuedConnection。擁有事件循環(huán)還可以使該線程能過使用需要事件循環(huán)的類,比如QTimer和QTcpSocket類等。注意,在線程中是無法使用任何的部件類的。 ? ??下面來看一個在圖形界面程序中啟動一個線程的例子,在界面上有兩個按鈕,一個用于開啟一個線程,一個用于關閉該線程。
1.創(chuàng)建項目。 ? ? 新建Qt Gui應用,名稱為“myThread”,類名為“Dialog”,基類選擇QDialog。
2.設計界面。 ? ??完成項目創(chuàng)建后進入設計模式,向界面中放入兩個Push Button按鈕,將第一個按鈕的顯示文本更改為“啟動線程”,將其objectName屬性更改為startButton;將第二個按鈕的顯示文本更改為“終止線程”,將其objectName屬性更改為stopButton,將其enabled屬性取消選中。
3.添加自定義線程類。 ? ??向項目中添加新的C++類,類名設置為“MyThread”,基類設置為“QThread”,類型信息選擇“繼承自QObject”。完成后進入mythread.h文件,先添加一個公有函數(shù)聲明: void stop(); 然后再添加一個函數(shù)聲明和一個變量的定義: protected: ? ? void?run(); private: ? ? volatile bool stopped; ? ??這里stopped變量使用了volatile關鍵字,這樣可以使它在任何時候都保持最新的值,從而可以避免在多個線程中訪問它時出錯。然后進入mythread.cpp文件中,先添加頭文件#include ,然后在構造函數(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變量設置為了true,這樣便可以結束run()函數(shù)中的循環(huán),從而從run()函數(shù)中退出,這樣整個線程也就結束了。這里使用了stopped變量來實現(xiàn)了進程的終止,并沒有使用危險的terminate()函數(shù)。
4.在Dialog類中使用自定義的線程。 先到dialog.h文件中,添加頭文件包含: #include "mythread.h" ? ??然后添加私有對象的定義: MyThread thread; ? ? 下面到設計模式,分別進入兩個按鈕的單擊信號對應的槽,更改如下:
// 啟動線程按鈕 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); ? ? } } ? ??在啟動線程時調用了start()函數(shù),然后設置了兩個按鈕的狀態(tài)。在終止線程時,先使用isRunning()來判斷線程是否在運行,如果是,則調用stop()函數(shù)來終止線程,并且更改兩個按鈕的狀態(tài)?,F(xiàn)在運行程序,按下“啟動線程”按鈕,查看應用程序輸出欄的輸出,然后再按下“終止線程”按鈕,可以看到已經(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標簽部件。
5.到dialog.cpp文件中,在構造函數(shù)里面添加信號和槽的關聯(liá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í)行,但是總有一些時刻,一些線程必須停止來等待其他線程。例如,如果兩個線程嘗試同時訪問相同的全局變量,結果通常是不確定的。QMutex提供了一個互斥鎖(mutex);QReadWriteLock即讀-寫鎖;QSemaphore即信號量;QWaitCondition即條件變量。
(三)可重入與線程安全 在查看Qt的幫助文檔時,在很多類的開始都寫著“All functions in this class are reentrant”,或者“All functions in this class are thread-safe”。在Qt文檔中,術語“可重入(reentrant)”和“線程安全(thread-safe)”用來標記類和函數(shù),來表明怎樣在多線程應用程序中使用它們: 一個線程安全的函數(shù)可以同時被多個線程調用,即便是這些調用使用了共享數(shù)據(jù)。因為該共享數(shù)據(jù)的所有實例都被序列化了。 一個可重入的函數(shù)也可以同時被多個線程調用,但是只能是在每個調用使用自己的數(shù)據(jù)時。

結語

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉