2012-04-21 80 views
3

我开发Qt的Symbian的应用,其中我有我的应用程序内重新启动我的应用程序,都习惯了。它在模拟器上工作正常,但不在设备上,它关闭但不能自行重新启动,我必须自己重新启动它,还有什么我必须做的,以使其在设备上工作。应用程序不重新启动的设备在Qt

+2

你尝试颠倒这两行的顺序吗? – Mat 2012-04-21 09:32:56

+0

@Mat是的,但同样的问题.. :( – abhishek 2012-04-21 09:54:11

+0

你使用什么设备?也许有你的设备的具体选项。我建议你试试在另一个设备上 – 2012-04-21 10:35:29

回答

2

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

+0

能否请您提供一些代码片断 – abhishek 2012-04-23 11:15:03

1

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

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

您的最终解决方案是按照@Riho的建议创建看门狗进程。您在致电quit之前启动看门狗过程,在看门狗主功能中,您等待几秒钟并重新启动应用程序。您将需要SwEvent功能来满足您的看门狗。

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); 

而我的应用程序正在重新启动,就像我想..如果任何更改nedded plese让我知道。

+0

它显示。?。“线程0x740已经慌类别:WSERV;原因:41”的错误在设备上的应用程序重新启动后,但不立即,应用程序启动正常,但当我打开它与上述错误崩溃其他一些屏幕。 – abhishek 2012-04-24 08:06:20

+0

'另外,QProcess :: startDetached'很可能甚至没有做任何事情,重启似乎是完全由于循环。所以,你应该有QProcess中相同的结果。也许你可以通过在循环外部创建它并保持相同的'QApplication'实例,并创建,显示和删除只有主窗口e循环。 – alexisdm 2012-04-24 10:59:46

+0

@alexisdm它运行正常第一次,但如果我再次调用该方法就说明线程慌了错误 – abhishek 2012-04-24 12:25:12

相关问题