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

时间:2012-05-09 07:10:19

标签: qt qprocess

我正在使用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中运行。发生了什么事?

2 个答案:

答案 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 )

给它一些时间或尝试传递-1QProcess无限期地等待:

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

注意:

来自waitForFinished()的文档:

警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。