qt - 它退出后Qt的QProcess仍然认为一个进程正在运行

  显示原文与译文双语对照的内容
0 0

我正在使用QProcess从 libs3 运行s3程序。


QString S3::runS3(const QStringList &args, const QByteArray &data)
{
 QProcess s3;

 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
 env.insert("S3_ACCESS_KEY_ID","xxx");
 env.insert("S3_SECRET_ACCESS_KEY","xxx");
 s3.setProcessEnvironment(env);

 s3.start("s3", args);
 if (!s3.waitForStarted())
 {
 qWarning() <<"Could not start the s3 process!";
 return QString();
 }

 if (data.size()> 0)
 {
 s3.write(data);
 s3.closeWriteChannel();
 }

 if (!s3.waitForFinished())
 {
 qWarning() <<"The s3 process did not complete successfully";
 if (s3.error() == QProcess::Timedout)
 {
 qWarning() <<"The s3 process took too long to execute";
 }

 qWarning() <<QString(s3.readAllStandardOutput());
 qWarning() <<QString(s3.readAllStandardError());
 qWarning() <<s3.exitCode();
 qWarning() <<s3.exitStatus();
 qWarning() <<s3.pid();

 return QString();
 }

 return QString(s3.readAll());
}

但是,每次运行这里代码时,waitForFinished方法都等待完整 30秒,并获得以下输出:


The s3 process did not complete successfully 
The s3 process took too long to execute 
"1474272 bytes remaining (1% complete).. .
1457888 bytes remaining (2% complete).. .
1441504 bytes remaining (3% complete).. .
1425120 bytes remaining (4% complete).. .
1408736 bytes remaining (5% complete).. .
1392352 bytes remaining (6% complete).. .
1375968 bytes remaining (7% complete).. .
1359584 bytes remaining (8% complete).. .
1343200 bytes remaining (9% complete).. .
1326816 bytes remaining (10% complete).. .
1310432 bytes remaining (12% complete).. .
1294048 bytes remaining (13% complete).. .
1277664 bytes remaining (14% complete).. .
1261280 bytes remaining (15% complete).. .
1244896 bytes remaining (16% complete).. .
1228512 bytes remaining (17% complete).. .
1212128 bytes remaining (18% complete).. .
1195744 bytes remaining (19% complete).. .
1179360 bytes remaining (20% complete).. .
1162976 bytes remaining (21% complete).. .
1146592 bytes remaining (23% complete).. .
1130208 bytes remaining (24% complete).. .
1113824 bytes remaining (25% complete).. .
1097440 bytes remaining (26% complete).. .
1081056 bytes remaining (27% complete).. .
1064672 bytes remaining (28% complete).. .
1048288 bytes remaining (29% complete).. .
1031904 bytes remaining (30% complete).. .
1015520 bytes remaining (31% complete).. .
999136 bytes remaining (32% complete).. .
982752 bytes remaining (34% complete).. .
966368 bytes remaining (35% complete).. .
949984 bytes remaining (36% complete).. .
933600 bytes remaining (37% complete).. .
917216 bytes remaining (38% complete).. .
900832 bytes remaining (39% complete).. .
884448 bytes remaining (40% complete).. .
868064 bytes remaining (41% complete).. .
851680 bytes remaining (42% complete).. .
835296 bytes remaining (43% complete).. .
818912 bytes remaining (45% complete).. .
802528 bytes remaining (46% complete).. .
786144 bytes remaining (47% complete).. .
769760 bytes remaining (48% complete).. .
753376 bytes remaining (49% complete).. .
736992 bytes remaining (50% complete).. .
720608 bytes remaining (51% complete).. .
704224 bytes remaining (52% complete).. .
687840 bytes remaining (53% complete).. .
671456 bytes remaining (54% complete).. .
655072 bytes remaining (56% complete).. .
638688 bytes remaining (57% complete).. .
622304 bytes remaining (58% complete).. .
605920 bytes remaining (59% complete).. .
589536 bytes remaining (60% complete).. .
573152 bytes remaining (61% complete).. .
556768 bytes remaining (62% complete).. .
540384 bytes remaining (63% complete).. .
524000 bytes remaining (64% complete).. .
507616 bytes remaining (65% complete).. .
491232 bytes remaining (67% complete).. .
474848 bytes remaining (68% complete).. .
458464 bytes remaining (69% complete).. .
442080 bytes remaining (70% complete).. .
425696 bytes remaining (71% complete).. .
409312 bytes remaining (72% complete).. .
392928 bytes remaining (73% complete).. .
376544 bytes remaining (74% complete).. .
360160 bytes remaining (75% complete).. .
343776 bytes remaining (76% complete).. .
327392 bytes remaining (78% complete).. .
311008 bytes remaining (79% complete).. .
294624 bytes remaining (80% complete).. .
278240 bytes remaining (81% complete).. .
261856 bytes remaining (82% complete).. .
245472 bytes remaining (83% complete).. .
229088 bytes remaining (84% complete).. .
212704 bytes remaining (85% complete).. .
196320 bytes remaining (86% complete).. .
179936 bytes remaining (87% complete).. .
163552 bytes remaining (89% complete).. .
147168 bytes remaining (90% complete).. .
130784 bytes remaining (91% complete).. .
114400 bytes remaining (92% complete).. .
98016 bytes remaining (93% complete).. .
81632 bytes remaining (94% complete).. .
65248 bytes remaining (95% complete).. .
48864 bytes remaining (96% complete).. .
32480 bytes remaining (97% complete).. .
16096 bytes remaining (98% complete).. .
" 
"" 
0 
0 
18506 
QProcess: Destroyed while process is still running.

我可以看到,在waitForFinished超时之前,S3流程明显没有运行在活动 Monitor.app 中。 发生. .. 出 什么 事 了?

时间: 原作者:

0 0

QProcess: 进程仍在运行时被破坏。

这仅仅意味着 QProcess 实例超出了范围,并且没有正确的终止就被破坏了,而不是的"qt认为进程在退出后正在运行"。

你可以尝试连接 QProcess::stateChanged(QProcess::ProcessState newState) 向某些 QObject slot 发送信号,以确定什么时候 "qt认为进程正在运行或者没有运行" 。

对于你的实际问题,我认为 s3 过程( 不是 QProcess ) 只需要 30秒以上的时间,即函数签名中的默认值:


bool QProcess::waitForFinished ( int msecs = 30000 )

给它一些时间或者尝试传递 -1 来让 QProcess 等待 undefinitely:


 if (!s3.waitForFinished(-1)){
///...
 }

备注:

waitForFinished()的文档中:

警告:从主线程调用这里函数可能导致用户界面冻结。

原作者:
...