亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? qt多線程編程.txt

?? 給想用QT進行網(wǎng)絡(luò)編程的朋友們收集到的一些資料
?? TXT
字號:
    Qt 作為一種基于 C++ 的跨平臺 GUI 系統(tǒng),能夠提供給用戶構(gòu)造圖形用戶界面的強大功能。為了滿足用戶構(gòu)造復(fù)雜圖形界面系統(tǒng)的需求,Qt 提供了豐富的多線程編程支持。

Qt 作為一種基于 C++ 的跨平臺 GUI 系統(tǒng),能夠提供給用戶構(gòu)造圖形用戶界面的強大功能。為了滿足用戶構(gòu)造復(fù)雜圖形界面系統(tǒng)的需求,Qt 提供了豐富的多線程編程支持。從 2.2 版本開始,Qt 主要從下面三個方面對多線程編程提供支持:一、構(gòu)造了一些基本的與平臺無關(guān)的線程類;二、提交用戶自定義事件的 Thread-safe 方式;三、多種線程間同步機制,如信號量,全局鎖。這些都給用戶提供了極大的方便。不過,在某些情況下,使用定時器機制能夠比利用 Qt 本身的多線程機制更方便地實現(xiàn)所需要的功能,同時也避免了不安全的現(xiàn)象發(fā)生。本文不僅對 Qt 中的多線程支持機制進行了討論,還著重探討了利用定時器機制模擬多線程編程的方法。

1、系統(tǒng)對多線程編程的支持

不同的平臺對 Qt 的多線程支持方式是不同的。當(dāng)用戶在 Windows 操作系統(tǒng)上安裝 Qt 系統(tǒng)時,線程支持是編譯器的一個選項,在 Qt 的 mkfiles 子目錄中包括了不同種類編譯器的編譯文件,其中帶有 -mt 后綴的文件才是支持多線程的。

而在 Unix 操作系統(tǒng)中,線程的支持是通過在運行 configure 腳本文件時添加 -thread 選項加入的。安裝過程將創(chuàng)建一個獨立的庫,即 libqt-mt,因此要支持多線程編程時,必須與該庫鏈接(鏈接選項為-lqt-mt),而不是與通常的 Qt 庫(-lqt)鏈接。

另外,無論是何種平臺,在增加線程支持時都需要定義宏 QT_THREAD_SUPPORT(即增加編譯選項-DQT_THREAD_SUPPORT)。在 Windows 操作系統(tǒng)中,這一點通常是在 qconfig.h 文件中增加一個選項來實現(xiàn)的。而在 Unix 系統(tǒng)中通常添加在有關(guān)的 Makefile 文件中。




	回頁首


2、Qt中的線程類

在 Qt 系統(tǒng)中與線程相關(guān)的最重要的類當(dāng)然是 QThread 類,該類提供了創(chuàng)建一個新線程以及控制線程運行的各種方法。線程是通過 QThread::run() 重載函數(shù)開始執(zhí)行的,這一點很象 Java 語言中的線程類。在 Qt 系統(tǒng)中,始終運行著一個GUI 主事件線程,這個主線程從窗口系統(tǒng)中獲取事件,并將它們分發(fā)到各個組件去處理。在 QThread 類中還有一種從非主事件線程中將事件提交給一個對象的方法,也就是 QThread::postEvent()方法,該方法提供了 Qt 中的一種 Thread-safe 的事件提交過程。提交的事件被放進一個隊列中,然后 GUI 主事件線程被喚醒并將此事件發(fā)給相應(yīng)的對象,這個過程與一般的窗口系統(tǒng)事件處理過程是一樣的。值得注意的是,當(dāng)事件處理過程被調(diào)用時,是在主事件線程中被調(diào)用的,而不是在調(diào)用QThread::postEvent 方法的線程中被調(diào)用。比如用戶可以從一個線程中迫使另一個線程重畫指定區(qū)域:

QWidget *mywidget;
QThread::postEvent(mywidget, new QPaintEvent(QRect(0,0,100,100)));
                


然而,只有一個線程類是不夠的,為編寫出支持多線程的程序,還需要實現(xiàn)兩個不同的線程對共有數(shù)據(jù)的互斥訪問,因此 Qt 還提供了 QMutex 類,一個線程在訪問臨界數(shù)據(jù)時,需要加鎖,此時其他線程是無法對該臨界數(shù)據(jù)同時加鎖的,直到前一個線程釋放該臨界數(shù)據(jù)。通過這種方式才能實現(xiàn)對臨界數(shù)據(jù)的原子操作。

除此之外,還需要一些機制使得處于等待狀態(tài)的線程在特定情況下被喚醒。QWaitCondition 類就提供了這種功能。當(dāng)發(fā)生特定事件時,QWaitCondition 將喚醒等待該事件的所有線程或者喚醒任意一個被選中的線程。




	回頁首


3、用戶自定義事件在多線程編程中的應(yīng)用

在 Qt 系統(tǒng)中,定義了很多種類的事件,如定時器事件、鼠標(biāo)移動事件、鍵盤事件、窗口控件事件等。通常,事件都來自底層的窗口系統(tǒng),Qt 的主事件循環(huán)函數(shù)從系統(tǒng)的事件隊列中獲取這些事件,并將它們轉(zhuǎn)換為 QEvent,然后傳給相應(yīng)的 QObjects 對象。

除此之外,為了滿足用戶的需求,Qt 系統(tǒng)還提供了一個 QCustomEvent 類,用于用戶自定義事件,這些自定義事件可以利用 QThread::postEvent() 或者QApplication::postEvent() 被發(fā)給各種控件或其他 QObject 實例,而 QWidget 類的子類可以通過 QWidget::customEvent() 事件處理函數(shù)方便地接收到這些自定義的事件。需要注意的是:QCustomEvent 對象在創(chuàng)建時都帶有一個類型標(biāo)識 id 以定義事件類型,為了避免與 Qt 系統(tǒng)定義的事件類型沖突,該 id 值應(yīng)該大于枚舉類型 QEvent::Type 中給出的 "User" 值。

在下面的例子中,顯示了多線程編程中如何利用用戶自定義事件類。

UserEvent類是用戶自定義的事件類,其事件標(biāo)識為346798,顯然不會與系統(tǒng)定義的事件類型沖突。

class UserEvent : public QCustomEvent   //用戶自定義的事件類
{
public:
 UserEvent(QString s) : QCustomEvent(346798), sz(s) { ; }
 QString str() const { return sz; }
private:
 QString sz;    
};
                


UserThread 類是由QThread類繼承而來的子類,在該類中除了定義有關(guān)的變量和線程控制函數(shù)外,最主要的是定義線程的啟動函數(shù)UserThread::run (),在該函數(shù)中創(chuàng)建了一個用戶自定義事件UserEvent,并利用QThread類的postEvent函數(shù)提交該事件給相應(yīng)的接收對象。

class UserThread : public QThread      //用戶定義的線程類
{
public:
 UserThread(QObject *r, QMutex *m, QWaitCondition *c);
QObject *receiver;
}
void UserThread::run()     //線程類啟動函數(shù),在該函數(shù)中創(chuàng)建了一個用戶自定義事件
{UserEvent *re = new UserEvent(resultstring);
   QThread::postEvent(receiver, re); 
}
                


UserWidget類是用戶定義的用于接收自定義事件的QWidget類的子類,該類利用slotGo()函數(shù)創(chuàng)建了一個新的線程recv(UserThread類),當(dāng)收到相應(yīng)的自定義事件(即id為346798)時,利用customEvent函數(shù)對事件進行處理。

void UserWidget::slotGo()    //用戶定義控件的成員函數(shù)
{ mutex.lock();  
 if (! recv)
  recv = new UserThread(this, &mutex, &condition);
 recv->start();
 mutex.unlock();
}
void UserWidget::customEvent(QCustomEvent *e)   //用戶自定義事件處理函數(shù)
{ if (e->type()==346798) 
 {
  UserEvent *re = (UserEvent *) e;
        newstring = re->str();
    }
}
                


在這個例子中,UserWidget對象中創(chuàng)建了新的線程UserThread,用戶可以利用這個線程實現(xiàn)一些周期性的處理(如接收底層發(fā)來的消息等),一旦滿足特定條件就提交一個用戶自定義的事件,當(dāng)UserWidget對象收到該事件時,可以按需求做出相應(yīng)的處理,而一般情況下,UserWidget對象可以正常地執(zhí)行某些例行處理,而完全不受底層消息的影響。




	回頁首


4、利用定時器機制實現(xiàn)多線程編程

為了避免Qt系統(tǒng)中多線程編程帶來的問題,還可以使用系統(tǒng)中提供的定時器機制來實現(xiàn)類似的功能。定時器機制將并發(fā)的事件串行化,簡化了對并發(fā)事件的處理,從而避免了thread-safe方面問題的出現(xiàn)。

在下面的例子中,同時有若干個對象需要接收底層發(fā)來的消息(可以通過Socket、FIFO等進程間通信機制),而消息是隨機收到的,需要有一個GUI主線程專門負責(zé)接收消息。當(dāng)收到消息時主線程初始化相應(yīng)對象使之開始處理,同時返回,這樣主線程就可以始終更新界面顯示并接收外界發(fā)來的消息,達到同時對多個對象的控制;另一方面,各個對象在處理完消息后需要通知GUI主線程。對于這個問題,可以利用第3節(jié)中的用戶自定義事件的方法,在主線程中安裝一個事件過濾器,來捕捉從各個對象中發(fā)來的自定義事件,然后發(fā)出信號調(diào)用主線程中的一個槽函數(shù)。

另外,也可以利用Qt中的定時器機制實現(xiàn)類似的功能,而又不必擔(dān)心Thread-safe問題。下面就是有關(guān)的代碼部分:

在用戶定義的Server類中創(chuàng)建和啟動了定時器,并利用connect函數(shù)將定時器超時與讀取設(shè)備文件數(shù)據(jù)相關(guān)聯(lián):

Server:: Server(QWidget *parent) : QWidget(parent)
{
readTimer = new QTimer(this);   //創(chuàng)建并啟動定時器
   connect(readTimer, SIGNAL(timeout()), this, SLOT(slotReadFile()));   //每當(dāng)定時器超時時調(diào)用函數(shù)slotReadFile讀取文件
   readTimer->start(100);
}
                


slotReadFile函數(shù)負責(zé)在定時器超時時,從文件中讀取數(shù)據(jù),然后重新啟動定時器:

int Server::slotReadFile()    // 消息讀取和處理函數(shù)
{
  readTimer->stop();     //暫時停止定時器計時
  ret = read(file, buf );   //讀取文件
if(ret == NULL)
{    readTimer->start(100);     //當(dāng)沒有新消息時,重新啟動定時器
    return(-1);
}
  else
       根據(jù)buf中的內(nèi)容將消息分發(fā)給各個相應(yīng)的對象處理……;
readTimer->start(100);    //重新啟動定時器
}
                


在該程序中,利用了類似輪循的方式定時對用戶指定的設(shè)備文件進行讀取,根據(jù)讀到的數(shù)據(jù)內(nèi)容將信息發(fā)送到各個相應(yīng)的對象。用戶可以在自己的GUI主線程中創(chuàng)建一個Server類,幫助實現(xiàn)底層的消息接收過程,而本身仍然可以處理諸如界面顯示的問題。當(dāng)各個對象完成處理后,通過重新啟動定時器繼續(xù)進行周期性讀取底層設(shè)備文件的過程。當(dāng)然,這種方法適合于各對象對事件的處理時間較短,而底層設(shè)備發(fā)來消息的頻率又相對較慢的情況。在這種情況下,上述方法完全可以滿足用戶的需求,而又避免了處理一些與線程并發(fā)有關(guān)的復(fù)雜問題。

當(dāng)然,利用定時器機制實現(xiàn)多線程編程在某些方面具有一定的局限性,有關(guān)到底如何實現(xiàn)多線程編程,如何編寫出效率更高的代碼,還有待于開發(fā)者進一步研究和探討。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲综合另类在线| 国产精品欧美一区二区三区| 日韩精品中文字幕一区二区三区 | 国产欧美日产一区| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲电影在线播放| 99久久99久久精品国产片果冻| 制服视频三区第一页精品| 久久九九99视频| 蜜臀av性久久久久蜜臀av麻豆| 99久久er热在这里只有精品15| 精品久久久久一区| 日韩av在线播放中文字幕| 色婷婷久久一区二区三区麻豆| 久久午夜色播影院免费高清| 无码av中文一区二区三区桃花岛| 不卡一卡二卡三乱码免费网站| 精品久久人人做人人爱| 日韩不卡一区二区| 欧美日韩一区二区欧美激情| 一区二区三区资源| 97se亚洲国产综合自在线不卡| 精品国产伦一区二区三区观看体验| 亚洲123区在线观看| 欧美天天综合网| 亚洲一区二区av在线| 91蜜桃婷婷狠狠久久综合9色| 国产精品乱码人人做人人爱| 国产成人av一区二区| 久久久美女毛片| 国产精品香蕉一区二区三区| 精品国产乱码久久久久久影片| 寂寞少妇一区二区三区| 精品少妇一区二区| 亚洲午夜视频在线观看| 色综合久久久久综合99| 亚洲丝袜制服诱惑| 色狠狠av一区二区三区| 亚洲一区二区视频在线| 欧美日本高清视频在线观看| 午夜电影久久久| 制服丝袜亚洲精品中文字幕| 日韩av在线播放中文字幕| 欧美裸体bbwbbwbbw| 日韩电影在线一区二区| 日韩精品一区二区三区swag | 亚洲日本韩国一区| 91蝌蚪porny九色| 亚洲成人一区在线| 欧美一区午夜精品| 国产综合色视频| 中文字幕第一页久久| 91猫先生在线| 日本欧美大码aⅴ在线播放| 久久综合久久综合九色| 成人高清免费观看| 亚洲大片一区二区三区| 精品入口麻豆88视频| 成人不卡免费av| 一区二区成人在线视频| 日韩精品一区国产麻豆| 成人av在线一区二区| 亚洲第一久久影院| 久久精品亚洲麻豆av一区二区 | 国产精品国产自产拍高清av王其| 色八戒一区二区三区| 青青草91视频| 亚洲欧洲三级电影| 欧美一区二区黄色| 国产电影精品久久禁18| 亚洲国产人成综合网站| 国产亚洲一二三区| 欧美日韩二区三区| 国产成人福利片| 亚洲国产精品影院| 欧美国产成人精品| 欧美精三区欧美精三区| 北条麻妃国产九九精品视频| 青青草国产精品亚洲专区无| 国产精品久久夜| 日韩欧美一区二区三区在线| 色偷偷成人一区二区三区91| 久草精品在线观看| 五月激情综合婷婷| 综合久久综合久久| 久久精品在线观看| 91精品国产综合久久精品图片| 成人福利视频在线看| 黄页视频在线91| 香蕉成人啪国产精品视频综合网| 成人欧美一区二区三区黑人麻豆| 欧美电视剧免费全集观看| 欧美视频一二三区| 91小视频在线观看| 懂色av一区二区三区蜜臀| 另类综合日韩欧美亚洲| 亚洲午夜免费福利视频| 亚洲人快播电影网| 国产欧美视频一区二区| 日韩午夜激情视频| 91精品国产综合久久精品麻豆 | 国产精品18久久久久久久久| 日韩激情中文字幕| 亚洲丰满少妇videoshd| 一区二区三区免费观看| 亚洲视频一区二区免费在线观看 | 中文字幕永久在线不卡| 久久久久88色偷偷免费| 久久久久久免费| xfplay精品久久| 日韩精品中午字幕| 91精品国产91久久久久久最新毛片| 欧美日韩中字一区| 欧美日韩另类一区| 欧美精品日韩一区| 欧美一区二视频| 日韩你懂的电影在线观看| 欧美一区二区日韩一区二区| 91精品在线观看入口| 日韩免费在线观看| 久久久久久久久97黄色工厂| 久久青草国产手机看片福利盒子| 久久精品一区二区三区不卡牛牛| 久久久蜜桃精品| 国产精品久久久久久久岛一牛影视| 中文字幕第一区二区| 亚洲视频免费在线| 夜夜爽夜夜爽精品视频| 午夜精品免费在线| 九九**精品视频免费播放| 国产乱理伦片在线观看夜一区| 国产成人精品亚洲午夜麻豆| 国产成人aaa| 色综合天天做天天爱| 欧美在线影院一区二区| 91精品国产aⅴ一区二区| 日韩精品一区二区在线观看| 国产日韩精品视频一区| 日韩美女久久久| 视频一区二区欧美| 国产精品一区二区在线播放| av不卡在线播放| 欧美人伦禁忌dvd放荡欲情| 日韩精品一区二区三区视频| 亚洲国产精品二十页| 亚洲精品乱码久久久久| 日韩精品久久理论片| 国产精品综合二区| 欧美在线免费观看视频| 欧美电影免费观看高清完整版在线| 欧美国产一区在线| 亚洲成人激情自拍| 国模一区二区三区白浆| 在线一区二区三区四区五区| 欧美成人猛片aaaaaaa| 亚洲精品高清视频在线观看| 麻豆精品精品国产自在97香蕉| 成人禁用看黄a在线| 欧美精品一级二级| 中文字幕一区二| 久久精品国产成人一区二区三区| 91丨porny丨国产| 欧美大度的电影原声| 亚洲综合免费观看高清完整版在线| 国内精品在线播放| 欧美日韩中字一区| 中文字幕中文字幕一区| 另类欧美日韩国产在线| 欧洲一区二区av| 国产欧美一区视频| 蜜桃免费网站一区二区三区| 色综合久久天天| 国产精品情趣视频| 极品少妇一区二区三区精品视频| 欧美在线一区二区| 综合激情网...| 懂色av一区二区夜夜嗨| 久久色.com| 六月丁香婷婷久久| 91精品国产综合久久香蕉的特点| 亚洲综合久久久久| 91一区一区三区| 国产精品久久久久影院亚瑟| 国产一区 二区 三区一级| 日韩三级免费观看| 日韩精品91亚洲二区在线观看| 欧美亚洲尤物久久| **欧美大码日韩| 成人av综合在线| 中文字幕欧美日本乱码一线二线| 狠狠久久亚洲欧美| 精品久久人人做人人爰| 久久精品免费观看| 欧美成人免费网站| 美女久久久精品| 欧美xxxxx牲另类人与| 免费观看一级欧美片| 日韩亚洲电影在线| 久久91精品久久久久久秒播| 日韩欧美中文字幕一区|