我正在使用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进程显然没有在Activity Monitor.app中运行。发生了什么事?
答案 0 :(得分:1)
这个问题的原因是我没有正确地将Qt的事件循环与Wt集成,所以当我调用这些函数时它没有运行 - QProcess恰好需要事件循环。
答案 1 :(得分:0)
QProcess:在进程仍在运行时销毁。
这只是意味着QProcess
实例超出范围并在没有正确终止的情况下被销毁,而不是“Qt认为进程在退出后正在运行”。
您可以尝试将QProcess::stateChanged(QProcess::ProcessState newState)
信号连接到某个QObject
插槽,以确定“Qt认为某个进程是否正在运行”。
对于您的实际问题,我认为s3
进程(而不是QProcess
)只需要超过30秒,这是函数签名中的默认值:
bool QProcess::waitForFinished ( int msecs = 30000 )
给它一些时间或尝试传递-1
让QProcess
无限期地等待:
if (!s3.waitForFinished(-1)){
/// ...
}
注意:强>
来自waitForFinished()
的文档:
警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。