乐趣区

QProcess使用waitForFinished的小坑

  我们使用以下接口都会有超时机制,主要是避免长时间的阻塞。但有些类似有超时机制的接口在使用上就需要注意了。

bool QAbstractSocket::waitForBytesWritten(int msecs = 30000)
bool QAbstractSocket::waitForConnected(int msecs = 30000)
bool QAbstractSocket::waitForDisconnected(int msecs = 30000)
bool QAbstractSocket::waitForReadyRead(int msecs = 30000)

  一般我们使用 QProcess 执行命令时都会执行 waitForFinished 等待程序执行完成。细看接口可以看到它有默认的超时时间(30s),如果超过 30s 就会中断执行。如果我们执行某些耗时操作又没有设置超时时间则会导致一直中断执行从而得不到想要的结果。

bool QProcess::waitForFinished(int msecs = 30000)

  下列例子由于没有设置 waitForFinished 超时时间,如果 gzip 解压时间超过 30s 就得不到想要的结果。

QProcess gzip;
gzip.start("gzip –d /opt/etc.zip.gz");
if (!gzip.waitForStarted())
    return false;
    
if (!gzip.waitForFinished())
    return false;

QByteArray result = gzip.readAll();

  应该设置 可预计 的超时时间或 不可预计 的执行时间就应该设置 waitForFinished(-1) 参数(直到执行完成)。

退出移动版