首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QFile读取超时

QFile读取超时
EN

Stack Overflow用户
提问于 2014-07-31 15:50:53
回答 3查看 1.4K关注 0票数 2

我的应用程序需要从nfs挂载点读取文件。我使用的是QFile::read(BUFFER_SIZE);,它的工作原理是应该的。问题是,当nfs卸载(修补网络问题)时,这个QFile::read()永远不会超时,从而导致应用程序挂起。有什么合理的解决办法吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-01 11:31:26

我认为这是由于NFS的工作方式。进程被困在操作系统系统调用中,处于不间断的睡眠状态。所以,我认为你有两个可靠的选择:

  • 将文件读取移动到另一个线程。它和它的事件循环可能会被卡住,只需对主线程进行编码,这样对整个应用程序就不重要了。使用线程的方法有几种,但是如果不同时读取任意数量的不同文件,最好启动一个专门的线程来读取单个文件,然后让线程在读取完所有文件后完成。为此,您甚至可以只使用子类QThread,并使用自己的读取循环覆盖run()方法(如果需要,您仍然可以发出用于进度的信号,只是在没有Qt事件循环的情况下无法接收排队的信号)。
  • 将文件读取移到另一个进程。换句话说,编写一个小的工具程序或脚本来完成实际的读取,并将内容发送到您的主进程。这样,如果有必要的话,您应该能够在不杀死整个应用程序的情况下杀死读取过程。同样,您必须决定是否需要为每个读取单独使用一个单独的进程(例如,您可以将文件名命名为命令行参数),或者是否启动一个子进程并实现与它的通信,以便您可以请求文件(或文件的一部分)。Qt的QProcess也简化了这种方法。
票数 0
EN

Stack Overflow用户

发布于 2014-07-31 16:36:03

您可以使用从QFile::bytesAvailable ()继承的QIODevice,它返回可用于读取的字节数。在while循环中等待,直到字节可用或过了几秒钟:

代码语言:javascript
复制
QFile file("file.dat");
file.open(QIODevice::ReadOnly);

QElapsedTimer timer;
timer.start();

while(file.bytesAvailable()<BUFFER_SIZE || timer.nsecsElapsed()<3e9)
    qApp->processEvents();

QByteArray array
if(file.waitForReadyRead())
{
   array = file.read(BUFFER_SIZE);
}

在这里,它将等待3秒数据准备就绪。经过的时间是由QElapsedTimer测量的。如果超时后BUFFER_SIZE字节不可用,那么它将继续挂起。

票数 1
EN

Stack Overflow用户

发布于 2014-07-31 16:19:43

您可以使用QIODevice::readChannelFinished()信号并将其连接到关闭文件读取器的插槽。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25063508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档