成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實例操作 Qt 多線程 后臺創建縮略圖

移動開發
實例操作 Qt多線程后臺創建縮略圖 是本文將要介紹的內容,多線程大家應該接觸了不少,我們先來看本篇內容。

本文介紹的是實例操作 Qt 多線程 后臺創建縮略圖,不多說,更多資料參考本文末尾,先來看本文內容。

起因是在qtcn上看到有人說創建縮略圖的API執行很慢,并且阻塞了gui的正常運轉,需要改成多線程來實現,但他不清楚如何實現,希望能有個例子。 這位同學的問題揭示了Qt里最需要用到多線程的一個用例,那就是防止一切阻塞GUI線程的操作。 Qt GUI編程有個最基本但很多人不熟悉的原則是所有的操作都不能是阻塞的, 同時所有的操作都不能占用很多CPU, 這個原則是針對GUI線程來說的, 但后者對子線程也同樣適用(這一點我們后邊繼續八)。

熟悉Qt的人都應該有所了解,Qt的圖形處理是基于事件循環的,這一點和大多數的GUI工具庫一致。事件循環簡單來說就是個死循環,里面讀取系統外設的事件,然后見招拆招。 Qt里的Events, Signals,Timer都在事件循環里分發,所以,如果阻塞了事件循環用腳趾頭想想也能知道會有多么嚴重的后果,最明顯的就是界面不刷新,也不能和用戶交互,所以這就要求我們在寫程序的時候不管是事件處理函數還是槽函數里都不能進行占用CPU時間的操作,特別要杜絕阻塞性的操作如串口數據讀取、杜絕長時間的高CPU占用率的操作如死循環和大數據量的計算等。 However,“人在河邊走, 哪能不濕鞋”呢, 總有需要用到這些操作的時候,Qt也提供了解決方案,那就是多線程。

Qt多線程類有很多,改天開帖詳細介紹,這里只八最核心的QThread類。 該類的用法是Posix多線程的用法的簡化版, 只需要派生一個QThread的子類,實現其中的run虛函數就大功告成, 用的時候創建該類的實例,調用它的start方法,理論上非常簡單。 筆者個人覺得寫多線程的程序首先要去惡補一下多線程的知識, Qt說到底只是一個工具,它的API包裝得再好也得用的人懂得如何去使用才能發揮最好的作用。 Qt的文檔中關于多線程的編程文章挺多, 另外還列出了一系列的推薦讀物, 想把多線程程序寫好的人一定要看。

前面啰嗦了這么多無非是想告訴大家,寫多線程的程序單靠Qt的知識是不夠的(更別說有些人還沒用過Qt呢),多線程的知識更加重要。 而且單靠一兩篇簡單的文章是學不明白的,你看人家多線程編程能寫一大章書呢!好了,強調一下背景知識的重要性,下面要提供一個最簡單的Qt多線程的例子程序,它的功能是打開多個圖片文件之后創建線程執行圖片縮放的操作,創建圖片的縮略圖,完成后子線程會把縮略圖傳給GUI線程,由GUI線程創建Label控件來顯示縮略圖。各位看官注意了,這個例子很簡單,和多線程相關的部分其實很少,沒有用到Mutex也沒涉及并發等等概念, 單一的演示如何防止大數據量的計算阻塞GUI線程。

例子的源碼見附件,這里先列出一些關鍵的流程和代碼, 方便大家理解:

第一步:打開圖片文件

用QFileDialog::getOpenFileNames獲得圖片文件名的StringList

第二步:遍歷List創建線程

  1. void MainWin::createThumbnail(const QString& filename)  
  2. {  
  3.  QThread* thread = new ThumbnailThread(filename, 10 - waitseconds);  
  4.  connect(thread, SIGNAL(thumbnailFinished(QImage)), this, SLOT(addThumbnail(QImage)));  
  5.  connect(thread, SIGNAL(thumbnailFailed(const QString)), this, SLOT(showError(const QString)));  
  6.  connect(thread, SIGNAL(finished()), this, SLOT(deleteThread()));  
  7.  thread->start();  

finished是QThread類自帶的信號,在線程結束執行時發出; 其他兩個信號是自定義信號, 用于在GUI線程和子線程之間傳遞數據。

第三步:子線程內創建縮略圖

使用了QImage的scaled方法做圖片縮放。

  1. void ThumbnailThread::run()  
  2. {  
  3.  if( bigpm.isNull())  
  4.  {  
  5.   emit thumbnailFailed(pmfilename);  
  6.  }  
  7.  else  
  8.  {  
  9.   smallpm = bigpm.scaled(TN_WIDTH, TN_HEIGHT, Qt::KeepAspectRatio);  
  10.   emit thumbnailFinished(smallpm);  
  11.  }  

第四步:GUI線程處理thumbnailFinished信號

為每個圖片創建一個Label, 將之加到預先定義好的GridLayout中

  1. void MainWin::addThumbnail(QImage smallpm)  
  2. {  
  3.  static int i = 0;  
  4.  static int j = 0;  
  5.  
  6.  QLabel* label = new QLabel;  
  7.  label->setPixmap(QPixmap::fromImage(smallpm));  
  8.  QGridLayout* gl = qobject_cast(previewwidget->layout());  
  9.  gl->addWidget(label, j, i);  
  10.  label->show();  
  11.  qWarning() << "Label:" <isVisible();  
  12.  i++;  
  13.  if( i > previewwidget->width() / smallpm.width())  
  14.  {  
  15.   i = 0;  
  16.   j ++;  
  17.  }  

關鍵點提示:

Qt的signal可跨線程傳遞, 但要注意slot執行的線程。 connect時可以在第五個參數的位置指定連接的屬性(這里用了默認值), 如DirectConnection表示在connect函數執行的線程里執行slot, QueuedConnection表示slot執行在接受者所在的線程,(還有其他選項參看文檔)本例中的slot都執行在GUI線程中。

在收到finished信號后要清除執行完畢的線程, 為了防止刪除后對線程實例的訪問這里用了個deleteLater方法 — 在大家都不再訪問thread實例時再刪除。

Qt中所有和GUI相關的操作都要放在GUI線程里執行,包括所有Widget的創建和訪問,QPixmap的類也算GUI的類, 所以本例中只能用QImage來處理圖片。

這個例子其實用一個子線程就夠了,給每張圖片創建一個線程有點浪費。例子里有些為了測試需要加的代碼可能會影響閱讀(比如那個waitseconds),請大家自動忽略。 比如為了更好的看到效果,給線程里加了個sleep延緩處理圖片的速度…

原文鏈接:http://www.cuteqt.com/blog/?p=547

小結:關于實例操作 Qt 多線程 后臺創建縮略圖 的內容介紹完了,希望本文對你有所幫助!更多關于多線程的內容請參考編輯推薦。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2013-08-12 15:26:49

測試

2013-12-02 15:07:57

jQuery插件

2019-02-15 14:00:57

Linux命令縮略圖

2009-08-28 15:19:17

C#實現縮略圖

2009-08-28 10:22:13

Windows 7系統故障應對縮略圖無法顯示

2009-08-12 16:33:37

.NET生成縮略圖

2009-10-26 17:38:22

VB.NET實現縮略圖

2010-01-20 10:29:37

Chrome縮略圖標簽管理

2009-12-07 11:21:59

PHP生成縮略圖

2012-07-18 20:59:40

jQuery

2012-09-20 15:00:38

Win 8操作系統

2011-06-30 17:31:32

Qt 多線程 信號

2012-01-10 14:59:42

jQuery

2020-11-02 14:49:46

GitHub Java圖片

2022-02-21 16:38:19

Serverless圖片視頻

2023-05-15 17:04:33

Edge瀏覽器

2010-04-07 09:28:29

Chrome縮略圖

2021-07-01 14:52:17

Windows 11操作系統微軟

2011-06-22 16:18:23

QT 多線程 QSocket

2023-06-21 15:37:07

微軟Edge瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人毛片视频在线播放 | 欧美精品乱码久久久久久按摩 | 国产精品国产a | 精品一区二区三区在线播放 | 亚洲一区二区免费看 | 中文字幕在线观看视频网站 | 岛国二区 | 羞羞视频网站在线观看 | 999精品视频 | 国产美女一区二区三区 | 精品久久99 | 九九久视频 | 欧美区在线 | 91资源在线播放 | 亚洲va在线va天堂va狼色在线 | 一级a性色生活片久久毛片 一级特黄a大片 | 亚洲一区中文 | 一级a性色生活片久久毛片波多野 | 最近中文字幕免费 | www.亚洲.com| 久久久www成人免费无遮挡大片 | 久久国产精品99久久久久久丝袜 | 精品一区在线 | 美美女高清毛片视频免费观看 | 久久99精品久久久久久 | 天天干,夜夜操 | 亚洲风情在线观看 | 国产成人综合久久 | av黄色免费在线观看 | 国产一区91精品张津瑜 | 国产精品久久久久久久久久久久 | 成人深夜福利在线观看 | 爱草在线 | 欧美一区二区免费 | 一级全黄少妇性色生活免费看 | 国产成人精品一区二区三区四区 | 一区二区三区四区av | 中文字幕免费视频 | 国产精品久久精品 | 国产黄色大片网站 | 成人免费在线电影 |