2012-05-09 3 views
1

Я использую QProcess для запуска программы s3 от libs3.QT's QProcess по-прежнему считает, что процесс запущен после его выхода

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. 

Я могу видеть, что процесс S3 явно не запуск в Activity Monitor.app перед waitForFinished таймаутом. Что происходит?

+0

Сколько времени требуется для запуска программы 's3' с теми же аргументами из командной строки? – dschulz

ответ

1

Причина этой проблемы заключалась в том, что я не интегрировал цикл событий Qt с Wt должным образом, поэтому он не работал, когда я вызывал эти функции - для QProcess требуется цикл событий.

0

QProcess: Разрушенный во время процесса все еще работает.

Это просто означает, что экземпляр QProcess вышел из рамки и был разрушен без надлежащего прекращения, не то, что «Qt считает процесс запущен после того, как он вышел из».

Вы можете попробовать подключить QProcess::stateChanged(QProcess::ProcessState newState) сигнал к некоторым QObject слоту, чтобы знать наверняка, когда «Qt думает процесс или не работает».

Для вашей конкретной проблемы, я думаю, что s3 процесс (не QProcess) просто принимает более 30 секунд, что является значением по умолчанию в сигнатуре функции:

bool QProcess::waitForFinished (int msecs = 30000) 

Дайте ему еще некоторое время, или попробуйте передать -1, чтобы позволить QProcess ждать undefinitely:

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

ПРИМЕЧАНИЕ:

Из документации на waitForFinished():

Предупреждение: Вызов этой функции из главного (GUI) нити может привести к тому, пользовательский интерфейс для замораживания.

+0

Процесс определенно не занимает более 30 секунд. Та же проблема возникает при выполнении операции с несколько разными аргументами, которая занимает около одной секунды в командной строке. –

+0

Я пробовал этот код автономно, и он отлично работает, единственный раз, когда он не работает, это когда он находится в моем приложении Wt. Что может быть причиной этого? –