3

Qt symbian でアプリケーションを開発しています。アプリケーション内でアプリケーションを再起動する必要があり、以下を使用しています。

qApp->quit();
QProcess::startDetached(qApp->arguments()[0],qApp->arguments());

mainWindow のメソッドから。シミュレーターでは正常に動作していますが、デバイスでは動作していません。閉じますが、自動的に再起動しません。自分で再起動する必要があります。デバイスで動作させるために他に何かしなければならないことはありますか。

4

3 に答える 3

2

1つの解決策は、メインプログラムを閉じる前にメインプログラムから起動できる小さなコンソールプロセスを作成することです。次に、このコンソールプロセスは、プログラムを起動して閉じます。私はこの種のプロセスを使用して、アプリを追跡し、クラッシュしたときにアプリを再起動しています。

于 2012-04-23T10:47:40.910 に答える
1

マイナーですが基本的なことの1つ:Symbianにはエミュレーターがあり、シミュレーターはありません。違いは、後者はアセンブリレベルでデバイスをシミュレートするのに対し、前者はAPIサポートレベルでのみシミュレートすることです。たとえば、iPhoneシミュレーターは、アセンブリレベルで電話をシミュレートします。逆に、Symbianでは、基盤となるAPI実装は、ARMとWINSアーキテクチャでは異なる場合があり、完全に異なります。特に、アプリケーションを終了するなど、OSを操作する場合。

Symbianでのアプリケーション終了操作は、カーネルにプロセスをシャットダウンするように指示するメインのアクティブスケジューラループによってキャッチされる特別な例外(名前は覚えていませんが、KExitExceptionなど)をスローすることによって最終的に実装されます。つまり、同期呼び出しであることを意味します。最初に呼び出した場合quit、それstartProcess以降は実行されません。startProcess最初に呼び出してから呼び出した場合に機能しない理由は明確ではありません quit。これは、終了する前に完了できない非同期呼び出しであるか、2つのインスタンスで同じ(GUI)アプリケーションを開始できない可能性があります。とにかく、の戻り値をチェックして、startProcess成功したかどうかを確認してください。

最終的な解決策は、@Rihoが提案したウォッチドッグプロセスを作成することです。呼び出す前にウォッチドッグプロセスを開始しますquit。ウォッチドッグメイン関数では、数秒待ってからアプリケーションを再起動します。ウォッチドッグにはSwEvent機能が必要です。

于 2012-04-24T07:29:50.900 に答える
0

Qprocess()で試してみましたが、正常に動作しているようです(まだメモリとスレッドの問題をテストしています)

main.cppで私はこのコードを書きます(私は他のリンクから得ました)

int main(int argc, char *argv[])
{
    #define RESTART_CODE 1000

    int return_from_event_loop_code;
    QPointer<QApplication> app;
    QPointer<MainWindow> main_window;
    do
    {
        if(main_window) delete main_window;
        if(app) delete app;

        app = new QApplication(argc, argv);
        main_window = new MainWindow;
        QList<QString> lang = AppStatus::getCurrentLanguage();
        QTranslator translator;
        translator.load(lang.at(0));
        app->installTranslator(&translator);
        main_window->setOrientation(MainWindow::ScreenOrientationLockPortrait);


#if defined(Q_OS_SYMBIAN)
        main_window->showMaximized();
#else
        main_window->show();
#endif

        return_from_event_loop_code = app->exec();
    }
    while(return_from_event_loop_code==RESTART_CODE);

    return return_from_event_loop_code;
}

私の方法では、アプリを再起動する必要があります。これを作成しました。

QProcess::startDetached(qApp->applicationFilePath(),qApp->arguments());
qApp->exit(RESTART_CODE);

そして、私のアプリは私が望んでいたように再起動しています。

于 2012-04-24T07:55:09.237 に答える