3

更新が成功した後、次のロジックを使用してアプリケーションを再起動しています。

   QString appName = QApplication::instance()->applicationName();
   QString appDir =  QApplication::instance()->applicationFilePath();
   QStringList arguments = QApplication::instance()->arguments();

   QProcess::startDetached( appName, arguments, appDir );

   //quit the current application
   QApplication::instance()->exit();

新しいアプリケーションを起動し、両方のアプリケーションを終了します。Qtから、呼び出しプロセスを終了した後でも、新しいプロセスが存続することを理解しています。ここで何かが足りませんか?

4

1 に答える 1

4

ここに問題があります:

  1. appName空でないことは保証されていません。また、実行可能ファイルの名前と同じであることが保証されていません。いずれの場合もstartDetached()、実行可能ファイルへのフルパスが必要です。

  2. あなたappDirはそうではありません-それは実行可能ファイルの完全なファイルパスです。

  3. の最後の引数startDetached()は作業ディレクトリです。あなたは単にそのために使うことができますQDir::currentPath()

  4. 呼び出しているQApplicationメソッドはすべて静的です。を使用する必要はありませんinstance()

アプリケーションを更新するには、次のことができます。

  1. 現在実行中の実行可能ファイルの名前を別の名前に変更します。

  2. 新しい実行可能ファイルを元の名前で書き込みます。

  3. 以下のように開始します。

これは、アプリケーションに十分な管理者権限がある限り、WindowsとUnicesの両方で機能しますが、通常は機能しないため、十分なアクセス権を持つ別のアップデーターが必要です。アップデータは、ユーザーの都合の良いときに自分自身を再起動するようにアプリケーションに通知する必要があります。ユーザーが忙しく使用しているときにアプリケーションを強制的に再起動するのは、おそらくあまり良いことではありません。

以下は実際の例です。

#include <QtWidgets>

void start() {
    auto app = QCoreApplication::applicationFilePath();
    auto arguments = QCoreApplication::arguments();
    auto pwd = QDir::currentPath();
    qDebug() << app << arguments << pwd;
    QProcess::startDetached(app, arguments, pwd);
    QCoreApplication::exit();
}

int main(int argc, char **argv) {
    QApplication app{argc, argv};
    QPushButton button{QStringLiteral("Spawn")};
    Starter starter;
    QObject::connect(&button, &QPushButton::clicked, &start);
    button.show();
    app.exec();
}
于 2012-06-15T01:38:37.740 に答える