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

Qt中實現QThread線程同步QFtp

移動開發
本文講述的是在Qt中如何實現QThread線程同步QFtp,那么對于QFtp,它是一個用來實現FTP協議的類,#include <qftp.h> 繼承了QNetworkProtocol。本文由介紹。

Qt中實現QThread線程同步QFtp ,對于QFtp,它是一個用來實現FTP協議的類,詳情查閱資料。接觸Qt沒有多長時間,但簡單幾個小例子已經讓我感受到Qt在C++運用方面的強大。寫了一個小程序,需要在一個單獨的線程中使用QFtp來獲取FTP服務器上面的文件。FTP是FileZilla。

有兩個問題我比較關心:

(1)QThread到底如何使用

(2)QFtp是Async(異步)操作,也就是說例如connectToHost這樣的函數都是立刻返回,當操作完成后QFtp會發出signal。然而既然我的Ftp操作是在一個單獨的線程,我想寫一個函數downloadFtpFile() 來完成從connect到login到下載文件等一系列的操作,然后再返回。相當于我需要Sync(同步)的操作,所以需要等待(block)每個Ftp命令的結果。

在該文章最后有一個推薦的使用QThread的方法。我在這里想補充一點:obj.moveToThread(&thread); 這句話將obj從主線程移動到了thread對象所在的線程。但如果obj的對象里面有其他的變量,那么這些變量是在主線程中生成的。所以如果這些變量中有類變量,不能將obj的this指針作為parent傳給他們。

對于第二個問題,我使用了QSemaphore類來完成我的block和同步操作:在slot函數里面接收QFtp命令執行結果的signal,釋放信號,同時downloadFtpFile()函數里在調用完每一個QFtp異步命令后等待信號。在有點令人失望的是QSemaphore在通過tryAcquire()等待信號的時候是不處理事件event的。但是我需要在等待的時候程序也能觸發slot,告訴我當前命令的執行情況。所以我使用了一個小循環,里面調用qApp->processEvents();來讓我的slot函數被觸發。下面是代碼例子(只是樣例,并不完全符合C++語法):

首先是我的下載Ftp文件的函數:

 

  1. downloadFtpFile () //該函數在單獨線程里執行     
  2. {     
  3.      int m_idFtpOp; // 該變量用來存放每一個QFtp命令ID     
  4.      int nVal;     
  5.      QFtp*pFtp=newQFtp (this); // 生成QFtp工具對象     
  6.      connect (pFtp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(slotFtpListInfo(QUrlInfo))); // 我們需要listinfo,因為我們需要下載ftp所有當前目錄文件     
  7.      connect (pFtp,SIGNAL(commandFinished(int,bool)),this,SLOT(slotFtpCmdFinished(int,bool)));   
  8. // 每個QFtp命令完成之后,會發出commandFinished信號,我們在槽函數中處理該信號  
  9.      m_idFtpOp = pFtp->connectToHost (<FTP地址>, 21); // 連接到遠程FTP Server     
  10.      bRet=false;     
  11.      nVal=100;     
  12.      while (bRet == false) // 使用nVal變量來做一個10000ms(10s)的超時     
  13.      {     
  14.            nVal--;     
  15.            if (nVal == 0)     
  16.                 break;     
  17.            qApp->processEvents();   // 這里每100ms處理一次event,使slot函數能夠被調用     
  18.            bRet=m_SemOp.tryAcquire (1,100); // 等待信號100ms     
  19.      }     
  20.     if (!bRet || m_bFtpOpError)   // 如果超時,或者slot函數中將m_bFtpOpError置成true,則關閉Ftp,返回錯誤     
  21.       {     
  22.            pFtp->abort();     
  23.            pFtp->deleteLater();     
  24.            return ERRCODE_FCC_FTP_CONN_TIMEOUT;     
  25.      }     
  26. }   

下面是槽函數

  1. slotFtpCmdFinished (int id, bool error)     
  2. {     
  3.          if (m_idFtpOp == id)  // 如果返回的id是當前正在操作的命令     
  4.          {     
  5.                   if (error)     
  6.                            m_bFtpOpError=true;     
  7.                   else    
  8.                            m_bFtpOpError=false;     
  9.                   m_SemOp.release();  // 釋放信號(使downloadFtpFile函數中m_SemOp.tryAcquire()返回true)     
  10.          }     
  11. }   

以上的代碼只演示了對QFtp第一個命令connectToHost的等待過程。下面的login,list,get等操作都使用這個方法。

注意:在此例中,QFtp是在當前線程生成的,所以信號listInfo(QUrlInfo)的connect方式是direct連接。如果QFtp是在另一個線程生成(比如說是在函數downloadFtpFile所在類的構造函數中),那么第一:不能將this指針作為parent傳給QFtp對象,第二:需要使用qRegisterMetaType<QUrlInfo>("QUrlInfo");來注冊QUrlInfo類,因為信號發射與接收在不通的線程中,信號使用queued的方式。如果不注冊QURlInfo類,會在運行時動態報告錯誤。

總結:本文介紹的是在Qt中如何實現QThread線程同步QFtp ,看過本文之后,如果對于QThread不了解的話,那么請參考Qt中QThread使用方法這篇文章。使用本文介紹的方法,可以在獨立的線程中用同步的方式使用QFtp。在某些場合,尤其是采用應答機制的系統中,這樣的實現可以很大程度上簡化程序流程。

【編輯推薦】

淺談Qt中多線程編程

Qt環境變量配置與安裝

在Linux中設置Qt環境變量

用C#實現HTTP協議下的多線程文件傳輸

C#常用線程同步方法應用場景和實現原理

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

2011-06-14 10:18:58

QThread Qt 線程

2011-06-30 18:15:36

Qt 線程 同步

2011-06-20 13:43:08

Qt Socket 線程

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-24 11:12:39

Qt 多線程 線程

2011-06-30 17:51:17

QT 元類型 線程

2011-06-22 15:24:50

Qt 線程

2011-06-22 15:42:18

QT 信號

2011-06-30 11:23:29

Qt 線程

2011-06-13 10:03:19

Qt 多線程 編程

2011-06-30 17:31:32

Qt 多線程 信號

2010-03-18 14:36:46

Java線程同步

2011-06-13 17:46:07

Qt 串口通信

2011-06-22 10:12:08

Qt 線程

2010-01-21 11:27:30

linux多線程機制線程同步

2010-04-21 15:20:31

Unix線程

2011-06-28 15:18:45

Qt 單例模式

2009-07-01 17:34:03

Servlet和JSP

2009-03-24 08:56:23

數據同步多線程Java

2010-03-03 17:52:31

Python線程同步
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品一区 | 色综合久| 欧美一区二区视频 | 国产成人jvid在线播放 | 国产永久免费 | 久热精品在线观看视频 | 一级毛片视频免费观看 | 亚洲精品一区二区 | 久久精品无码一区二区三区 | 欧美日韩精品在线免费观看 | 成人在线观看网址 | 国产精品日日做人人爱 | 国产精品视频www | 国产区一区 | 久久久久久久一级 | 一区二区三区免费看 | 夏同学福利网 | 欧美激情一区二区三区 | 久久亚洲国产 | 欧美日韩精选 | 日韩高清中文字幕 | 午夜av电影院 | 国产免费一区二区 | 亚洲入口 | 精品一区二区三区在线观看 | 亚洲免费久久久 | 免费成人高清在线视频 | 欧美成人精品欧美一级 | 噜久寡妇噜噜久久寡妇 | 欧美一区二区三区四区在线 | 亚洲精品国产偷自在线观看 | 亚洲1区| 欧美日韩一区二区三区不卡视频 | 91免费在线看 | 国产美女久久 | 黄片毛片免费观看 | 午夜电影网站 | 国产一区免费 | 久久久久国产 | 国产精品激情小视频 | 看一级黄色毛片 |