QIODevice (Qt中全部 I/O devices 的基類,QFile,QBuffer,QTcpSocket等)

 QIODevice是全部Qt I/O設備的基類,它提供了對支持塊讀寫設備(例如QFile,QBuffer,QTcpSocket)的通用實現和抽象接口。QIODevice是一種抽象,不能被實例化,可是,利用其提供的通用接口能夠實現設備無關的I/O特性。html

       在訪問設備前,必須首先使用open()函數打開並設定正確的訪問模式OpenMode(例如ReadOnly/ ReadWrite)。而後,可用write()或者putChar()寫設備,或利用read(),readLine(),readAll()讀設備。完事以後用close()關閉設備。QIODevice具備如下信號:編程

readyRead() -- 當data有新數據準備好時發出信號。例如,新數據經過network到達或者有數據附加到了你正在讀取的文件以後;安全

bytesAvailable()-- 肯定當前可讀數據的字節數,當對非同步設備例如QTcpSocket(此類設備的數據段到達的時間是隨機的)編程時,常與readyRead()信號聯用。網絡

bytesWritten() -- 每當負載數據被寫入設備時觸發該信號。使用bytesToWrite()信號肯定當前等待被寫入的數據量。dom

某些QIODevice類,例如QTcpSocket和QProcess,是非同步的。如write() 或者read()之類的函數老是當即返回,而此時設備可能在函數返回事件循環(event loop)期間通訊。QIODevice提供了能夠強制操做當即被執行,阻塞回調線程,不用進入事件循環的函數:異步

waitForReadyRead() ------This function suspends operation in the calling thread until new data is available for reading.
waitForBytesWritten() - ---This function suspends operation in the calling thread until one payload of data has been written to the device.
waitFor....() ------------------Subclasses of QIODevice implement blocking functions for device-specific operations. For example, QProcess has a function called waitForStarted() which suspends operation in the calling thread until the process has started.
從主函數,GUI線程調用這些函數可能致使界面凍結:函數

 1 QProcess gzip;
 2  gzip.start("gzip", QStringList() << "-c");
 3  if (!gzip.waitForStarted())
 4      return false;
 5 
 6  gzip.write("uncompressed data");
 7 
 8  QByteArray compressed;
 9  while (gzip.waitForReadyRead())
10      compressed += gzip.readAll();

轉自:http://m.blog.csdn.net/article/details?id=45245915oop

 

QIODevice爲支持讀寫數據塊的device提供通用的實現和抽象接口,如QFile,QBuffer,QTcpSocket。spa

QIODevice 是一個抽象類,因此不能被實例化。但一般會用到它定義的接口,這些接口提供設備依賴的I/O特性。例如Qt的XML類經過操做一個QIODevice 的 指針,可使用各類各樣的設備(files,buffers等)。.net

在訪問設備以前,先調用open(),並設置正確的OpenMode(例如ReadOnly或者ReadWrite)。你能夠用write(),putChar()來寫入設備。也能夠用read(),readLine()來讀設備。使用完畢後調用close().

QIODevice 區分兩種類型的設備Random-access(隨機讀取)和Sequential(順序讀取)。

isSequential()用來判斷具體的類型是啥。

當數據可讀時,QIODevice發射readyRead()信號,例如新數據抵達網絡,或者附加的數據追加到你正在讀取的文件中。你能夠調用bytesAvailable()來肯定當前可讀的字節數。在QTcpSocket中(零散的數據可能隨時到達),常常把readyRead()信號和bytesAvailable()一塊用。

當數據已經寫入設備時,QIODevice會放射bytesWriten()信號.btyesToWriten()肯定當前將要被寫人的數據的字節數。

某些子類如QTcpSocket 和 QProcess 是異步的。意味着read() 和 write()老是馬上返回。QIODevice提供函數容許你從這些操做中當即返回,當阻塞在調用線程而且沒有進入事件循環時。QIODevice 容許子類在沒有事件循環的狀況,或者在一個獨立的線程中使用。

waitForReadyRead()將阻塞線程直到數據到來。

waitForBytesWriten()將阻塞線程直到數據寫入。

waitFor…()子類會實現相應的函數爲了特殊的操做。好比QProcess有個叫waitForStarted()的函數。它將會延遲調用的線程,直到那個process已經啓動。

經過子類化QIODevice,能夠提供相同的接口爲本身I/O設備。QIODevice的子類僅須要實現protected的readData()和writeData(),QIODevice用這些函數實現了不少方便使用的函數。例如getChar(),readLine(),write()。QIODevice能夠爲你提供訪問控制。能夠安全的假設當writeData()函數被調用時,設備已打開。

一些子類,如QFile,QTcpSocket,會使用內存緩衝區實現存儲臨時的數據。這將減小設備訪問的次數,從而提升讀寫效率。它將是getChar(),putChar()這樣的函數更有效率,當你在內存緩衝區中操做數據而不是和訪問設備自己。

轉自:http://blog.csdn.net/u011125673/article/details/50475243

相關文章
相關標籤/搜索