我的应用程序需要从nfs
挂载点读取文件。我使用的QFile::read(BUFFER_SIZE);
按照预期的方式工作。问题是,当nfs
卸载(补丁网络问题)时,此QFile::read()
永远不会超时导致应用程序挂起。有什么明智的解决方案吗?
感谢。
答案 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
也使这种方法变得简单。