QProcess使用waitForFinished的小坑

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

1
2
3
4
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就会中断执行。如果我们执行某些耗时操作又没有设置超时时间则会导致一直中断执行从而得不到想要的结果。

1
bool QProcess::waitForFinished(int msecs = 30000)

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

1
2
3
4
5
6
7
8
9
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)参数(直到执行完成)。