zoukankan      html  css  js  c++  java
  • QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)

     QIODevice是所有Qt I/O设备的基类,它提供了对支持块读写设备(例如QFile,QBuffer,QTcpSocket)的通用实现和抽象接口。QIODevice是一种抽象,不能被实例化,但是,利用其提供的通用接口可以实现设备无关的I/O特性。

           在访问设备前,必须首先使用open()函数打开并设定正确的访问模式OpenMode(例如ReadOnly/ ReadWrite)。然后,可用write()或者putChar()写设备,或利用read(),readLine(),readAll()读设备。完事之后用close()关闭设备。QIODevice具有以下信号:

    readyRead() -- 当data有新数据准备好时发出信号。例如,新数据通过network到达或者有数据附加到了你正在读取的文件之后;

    bytesAvailable()-- 确定当前可读数据的字节数,当对非同步设备例如QTcpSocket(此类设备的数据段到达的时间是随机的)编程时,常与readyRead()信号联用。

    bytesWritten() -- 每当负载数据被写入设备时触发该信号。使用bytesToWrite()信号确定当前等待被写入的数据量。

    某些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=45245915

    QIODevice为支持读写数据块的device提供通用的实现和抽象接口,如QFile,QBuffer,QTcpSocket。

    QIODevice 是一个抽象类,所以不能被实例化。但通常会用到它定义的接口,这些接口提供设备依赖的I/O特性。例如Qt的XML类通过操作一个QIODevice 的 指针,可以使用各种各样的设备(files,buffers等)。

    在访问设备之前,先调用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

  • 相关阅读:
    selenium+java+testNG+maven环境搭建
    pycharm配置git版本管理
    Android的WebView有哪些坑?
    Android M中 JNI的入门学习
    Android初学者必知会的编程规范
    Android Studio中怎么使用DDMS工具?
    Android开发中适配多种 ROM 的快捷方式是如何实现的?
    Android中ListView 控件与 Adapter 适配器如何使用?
    Android中如何为自定义控件增加状态?
    29个android开发常用的类、方法及接口
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/6473935.html
Copyright © 2011-2022 走看看