QFile读取超时

时间:2014-07-31 15:50:54

标签: c++ qt nfs

我的应用程序需要从nfs挂载点读取文件。我使用的QFile::read(BUFFER_SIZE);按照预期的方式工作。问题是,当nfs卸载(补丁网络问题)时,此QFile::read()永远不会超时导致应用程序挂起。有什么明智的解决方案吗?

感谢。

3 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

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

答案 2 :(得分:0)

我认为这是由于NFS的工作原理。该过程停留在OS系统调用中,处于不间断睡眠状态。所以,我认为你有两个可靠的选择:

  • 将文件读取移至另一个线程。它和它的事件循环可能会卡住,只需编写你的主线程代码,这样它就不会对整个应用程序产生影响。有几种方法可以为此使用线程,但如果您不是同时读取任意数量的不同文件,那么最好是启动专用线程来读取单个文件,然后一旦读完所有内容,让线程完成。为此,您甚至可能只是将QThread子类化,并使用您自己的读取循环覆盖run()方法(如果您愿意,您仍然可以发出信号以进行处理,您只能在没有排队的情况下接收它们Qt的事件循环)。

  • 将文件读取移至另一个进程。换句话说,编写一个执行实际读取的小工具程序或脚本,并将内容发送到主进程。这样你应该能够杀死阅读过程而不会杀死整个应用程序,如果有必要的话。同样,您必须决定是否要为每个读取单独使用一个进程(例如,您可以将文件名作为命令行参数),或者如果您启动一个子进程并实现与它的通信,以便您可以请求文件(或部分文件)。 Qt的QProcess也使这种方法变得简单。