我正在使用Qt symbian开发一个应用程序,我必须在我的应用程序中重启我的应用程序,使用过:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0],qApp->arguments());
来自mainWindow中的方法。它在模拟器上工作正常但不在设备上,它关闭但不能自行重启,我必须自己重新启动它,我还有什么办法让它在设备上工作。
答案 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);
我的应用程序正在重新启动,就像我想要的那样。如果有任何变化,请告诉我。