应用程序未在设备上重新启动在Qt中

时间:2012-04-21 09:30:18

标签: qt qt4 symbian

我正在使用Qt symbian开发一个应用程序,我必须在我的应用程序中重启我的应用程序,使用过:

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

来自mainWindow中的方法。它在模拟器上工作正常但不在设备上,它关闭但不能自行重启,我必须自己重新启动它,我还有什么办法让它在设备上工作。

3 个答案:

答案 0 :(得分:2)

一种解决方案是创建一个小型控制台进程,您可以在关闭它之前从主程序启动它。然后,此控制台进程将启动您的程序并关闭。 我一直在使用这种流程来跟踪我的应用程序,并在崩溃时重新启动它们。

答案 1 :(得分:1)

一个小但基本的东西:在Symbian上有一个模拟器而不是模拟器。不同之处在于后者在汇编级别上模拟设备,而前者仅在API支持级别上进行模拟。例如,iPhone模拟器在装配级别模拟手机。相反,在Symbian中,底层API实现可能并且对于ARM和WINS架构而言完全不同。特别是在与操作系统交互时的情况下,例如退出应用程序。

Symbian上的应用程序退出操作最终是通过抛出一个特殊的异常(我不记得它的名字,比如KExitException)来实现的,该异常由Active Scheduler循环捕获,告诉内核关闭进程。换句话说,这意味着它是同步调用。如果您先拨打quit然后再拨startProcess,那么后者将永远不会被执行。如果你先调用startProcess然后调用quit,那么为什么它不起作用并不清楚:这可能是一个异步调用,在你退出之前无法完成,或者你很简单就无法启动它( GUI)两个实例中的应用程序。无论如何,检查startProcess的返回值,看它是否成功。

你的最终解决方案是建立@Riho建议的监督程序。在调用quit之前启动监视程序进程,在监视程序主函数中等待几秒钟并重新启动应用程序。您需要为看门狗提供SwEvent功能。

答案 2 :(得分: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);

我的应用程序正在重新启动,就像我想要的那样。如果有任何变化,请告诉我。