1

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 がタイムアウトする前に、Activity Monitor.app で S3 プロセスが明らかに実行されていないことがわかります。どうしたの?

4

2 に答える 2

1

この問題の原因は、Qt のイベント ループを Wt と適切に統合していなかったため、これらの関数を呼び出したときに実行されていなかったためです。QProcess はたまたまイベント ループを必要とします。

于 2012-06-19T06:37:22.890 に答える
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)スレッドからこの関数を呼び出すと、ユーザーインターフェイスがフリーズする可能性があります。

于 2012-05-10T01:25:16.730 に答える