2012-05-09 87 views
1

我正在使用QProcess從libs3運行s3程序。Qt的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的過程顯然是不在waitForFinished超時之前在Activity Monitor.app中運行。這是怎麼回事?

+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) 

給它一些時間或試圖通過-1QProcess等待undefinitely:

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

注:

從文檔上waitForFinished()

警告:調用從主(GUI)線程此功能可能會導致您的用戶界面凍結。

+0

這個過程絕對不會超過30秒。運行具有稍微不同參數的操作時會發生同樣的問題,這隻會在命令行上花費大約一秒的時間。 –

+0

我試過這個代碼獨立,它工作正常,它不工作的唯一時間是當它在我的Wt應用程序。什麼可能導致? –

相關問題