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线程调用这些函数可能导致界面冻结:

 QProcess gzip;
gzip.start("gzip", QStringList() << "-c");
if (!gzip.waitForStarted())
return false; gzip.write("uncompressed data"); QByteArray compressed;
while (gzip.waitForReadyRead())
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

QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)的更多相关文章

  1. 图像处理中创建CDib类时无法选择基类类型时怎么办

    图像处理中创建CDib类时无法选择基类类型时怎么办? 类的类型选择Generic Class 在下面的篮筐里输入CObject就行了

  2. Qt中内存泄露和退出崩溃的问题 delete

    Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):d ...

  3. Qt中对QDomDocument和QDomnode的理解

    一.对QDomDocument和QDomnode的理解 QDom前缀的都是代表节点类型.所以有,QDomElement代表一个Element节点,而QDomText代表一个Text节点.QDomNod ...

  4. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  5. QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  6. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  7. QT中QProcess调用命令行的痛苦经历(调用Winrar,设置工作目录,获得输出,注意引号与括号,等等)

    QT中QProcess调用命令行的痛苦经历   阅读目录 创建压缩包的方法 在QT中调用命令行 在QT中调用C++创建的dll 在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在Q ...

  8. Qt中Ui名字空间以及setupUi函数的原理和实现 <转>

    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...

  9. Qt中Ui名字空间以及setupUi函数的原理和实现

    用最新的QtCreator选择GUI的应用会产生含有如下文件的工程 下面就简单分析下各部分的功能. .pro文件是供qmake使用的文件,不是本文的重点[不过其实也很简单的],在此不多赘述. 所以呢, ...

随机推荐

  1. C/C++/Objective-C经典书籍推荐

    C语言要从大而全,从基础開始.它属于最好的.别被它误导.它也有非常多错误,不适合标准软件开发人员使用.变量声明,定义,编程规范全然不合规范,可是从语言学习方面做到极致,有大量不同的样例和试题.标准的教 ...

  2. [svc]NFS存储企业场景及nfs最佳实战探究

    办公网络里人一般系统用共享,尤其是财务, 他们喜欢直接点开编辑. 而不喜欢ftp nfs在网站架构中的用途 注: 如果pv量少,则放在一台机器上速度更快,如果几千万pv,则存储分布式部署. 网站架构中 ...

  3. 【Unity】第8章 GUI开发

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 前面的章节中实际上已经多次使用了GUI,只不过用法都比较简单,这一章系统地介绍Unity 5.x自带的GUI(称为Uni ...

  4. linux命令(51):set 指定行,直接替换并修改文件

    sed 命令: 指定行,从第一行到第一行: 把该行的ssd,换成cd: -i 表示的是替换并直接修改文件: sed  -i  '1,1s/ssd/cd/g' test_file 命令使用: sed - ...

  5. 非网络引用element-ui css导致图标无法正常显示的解决办法

    https://blog.csdn.net/m0_37893932/article/details/79460652 ***************************************** ...

  6. js设置cookie(原生js)

    cookie 与 session 是网页开发中常用的信息存储方式.Cookie是在客户端开辟的一块可存储用户信息的地方:Session是在服务器内存中开辟的一块存储用户信息的地方. JavaScrip ...

  7. 如何调用Http请求的接口

    /// <summary> /// 发起一个HTTP请求(以POST方式) /// </summary> /// <param name="url"& ...

  8. Xtrabackup—InnoDB实现mysql热备份

    前面Zabbix使用的数据库是mysql,数据库备份不用多说,必须滴,由于使用的是innodb引擎,既然做,那就使用第三方强大的Xtrabackup工具来热备吧,Xtrabackup的说明,参见htt ...

  9. ipconfig 命令有什么作用

    ipconfig /all:显示本机TCP/IP配置的详细信息:ipconfig /release:DHCP客户端手工释放IP地址:ipconfig /renew:DHCP客户端手工向服务器刷新请求: ...

  10. Xapian构建索引说明

    Reference: http://www.totogoo.com/article/115/xapian-desc.html Xapian与开源 Xapian的官方网站是http://www.xapi ...