我正在Qt symbian上开发一个应用程序,我必须在我的应用程序中重新启动我的应用程序,使用过:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0],qApp->arguments());
来自 mainWindow 中的方法。它在模拟器上运行良好但在设备上运行良好,它关闭但不会自行重新启动,我必须自己重新启动它,我还需要做些什么才能使其在设备上运行。
一种解决方案是创建小型控制台进程,您可以在关闭它之前从主程序启动它。然后这个控制台进程将启动你的程序并关闭。我一直在使用这种进程来跟踪我的应用程序并在它们崩溃时重新启动它们。
一件小事但基本的事情:在 Symbian 上有一个emulator而不是一个Simulator。不同之处在于后者在组装级别模拟设备,而前者仅在 API 支持级别上进行。例如,iPhone 模拟器在组装级别模拟手机。相反,在 Symbian 中,底层 API 实现对于 ARM 和 WINS 架构可能并且完全不同。尤其是在您与操作系统交互(例如退出应用程序)的这种情况下。
Symbian 上的应用程序退出操作最终是通过抛出一个特殊异常(我不记得它的名字,类似于 KExitException)来实现的,该异常被告知内核关闭进程的主 Active Scheduler 循环捕获。换句话说,这意味着它是一个同步调用。如果你第一次打电话quit
,那么startProcess
后面的电话将永远不会被执行。startProcess
尚不清楚为什么如果您先调用然后它不起作用 quit
:这可能是一个异步调用,在您退出之前无法完成,或者您无法在两个实例中启动相同的(GUI)应用程序。无论如何检查它的返回值,startProcess
看看它是否成功。
您的最终解决方案将是按照@Riho 的建议创建一个看门狗进程。在调用之前启动看门狗进程quit
,在看门狗主函数中等待几秒钟并重新启动应用程序。您需要为您的看门狗提供 SwEvent 功能。
我已经用 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);
我的应用程序正在按照我的意愿重新启动。如果有任何更改,请告诉我。