我的应用程序需要从nfs挂载点读取文件。我使用的是QFile::read(BUFFER_SIZE);,它的工作原理是应该的。问题是,当nfs卸载(修补网络问题)时,这个QFile::read()永远不会超时,从而导致应用程序挂起。有什么合理的解决办法吗?
谢谢。
发布于 2014-08-01 11:31:26
我认为这是由于NFS的工作方式。进程被困在操作系统系统调用中,处于不间断的睡眠状态。所以,我认为你有两个可靠的选择:
QThread,并使用自己的读取循环覆盖run()方法(如果需要,您仍然可以发出用于进度的信号,只是在没有Qt事件循环的情况下无法接收排队的信号)。QProcess也简化了这种方法。发布于 2014-07-31 16:36:03
您可以使用从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字节不可用,那么它将继续挂起。
发布于 2014-07-31 16:19:43
您可以使用QIODevice::readChannelFinished()信号并将其连接到关闭文件读取器的插槽。
https://stackoverflow.com/questions/25063508
复制相似问题