QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)

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()这样的函数更有效率,当你在内存缓冲区中操作数据而不是和访问设备本身。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lc-cnblong/archive/2013/02/03/2890532.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现异步I/O主要依赖于信号与槽机制。一般来说,异步I/O分为两种类型:基于事件的异步I/O和基于回调的异步I/O。 在基于事件的异步I/OQt通过将一个对象的信号与另一个对象的槽进行连接,实现了异步I/O。当I/O事件发生时,Qt会自动触发相应的信号,从而调用相应的槽函数进行处理。 在基于回调的异步I/OQt使用QIODevice类提供的异步API。使用这些API,我们可以在进行I/O操作时指定一个回调函数,当I/O操作完成时,Qt会自动调用这个回调函数进行处理。 下面是一个基于事件的异步I/O的示例代码: ```cpp #include <QtNetwork> class MyServer : public QObject { Q_OBJECT public: MyServer(QObject *parent = nullptr) : QObject(parent) { m_server = new QTcpServer(this); connect(m_server, &QTcpServer::newConnection, this, &MyServer::onNewConnection); } void listen(const QHostAddress &address, quint16 port) { m_server->listen(address, port); } private slots: void onNewConnection() { QTcpSocket *socket = m_server->nextPendingConnection(); connect(socket, &QTcpSocket::readyRead, this, &MyServer::onReadyRead); } void onReadyRead() { QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); if (socket) { QByteArray data = socket->readAll(); // 处理数据 } } private: QTcpServer *m_server; }; ``` 在这个示例代码,我们创建了一个TCP服务器,并将服务器的newConnection信号与onNewConnection槽进行连接。当有客户端连接到服务器时,Qt会自动触发newConnection信号,从而调用onNewConnection槽函数。 在onNewConnection槽函数,我们获取到连接的socket,并将socket的readyRead信号与onReadyRead槽函数进行连接。当socket接收到数据时,Qt会自动触发readyRead信号,从而调用onReadyRead槽函数进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值