需要在基于MIPS的平台上编写Qt应用程序。
但是有很多限制。约束包括在需要时释放少量资源(QGFX插件,GPU内存等)并重新使用它。但是,当应用程序处理大量其他请求并运行其他任务时,该应用程序无法被杀死。
基本上,需要杀死GUI并释放与GUI相关的所有资源;稍后当需要重新启动时
尝试过的方法之一是:
main() - >创建一个新线程
在New-Thread中,
while(<Condition>)
{
sem_wait(..)
m_wnd = new myMainWindow();
...
..
app->exec();
}
当有一个kill命令时,它会从事件循环中出来,并等待来自其他线程的信号。一旦其他线程执行了所需的更改,它将获取信号并创建一个新窗口并进入事件循环。
在main()中,还创建了很少的其他线程,它们控制其他设备等,并指示Qt-GUI的启动和停止。
以上似乎有效,但我不确定这是否是正确的设计。它会造成任何问题吗?
任何人都可以提出更好的建议吗?
答案 0 :(得分:1)
我能够在Qt-Forums中找到所需的答案。
由于主要目的是删除与GUI相关的所有内容(在屏幕上),我可以使用void setQuitOnLastWindowClosed ( bool quit )
(Details Here)。这将确保GUI /主窗口关闭,并且应用程序仍然没有出现事件循环,我可以稍后重新启动主窗口。
谢谢
答案 1 :(得分:0)
当我需要一种方法来确保我的应用程序继续运行时,我将其分成一个子流程。这样,即使它出现了分段故障,主要流程也会抓住它并启动一个新的子流程。在子进程中,我有多个线程用于GUI和非GUI任务。 fork代码很短,基于wait(2)手册页中给出的示例。 main()只是在while循环中调用createChild()
。 createChild()
使用zmain()
启动新流程。 zmain()
是您的QT应用程序的主要内容。
#include <QtGui/QApplication>
#include <QThread>
int zmain(int argc, char *argv[])
{
QApplication app(argc, argv, true);
app.setQuitOnLastWindowClosed(false);
QThread powerThread;
Power p;
p.moveToThread(&powerThread);
powerThread.start();
return app.exec();
}
// The following code is taken from the wait(2) man page and has been modified to run
// our Qt main() above in a child process. When the child terminates, it is automatically
// restarted.
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int createChild(int argc, char *argv[]) {
pid_t cpid, w;
int status;
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Code executed by child */
fprintf(stderr, "Child PID is %ld\n", (long) getpid());
exit(zmain(argc, argv));
} else { /* Code executed by parent */
do {
w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
return(EXIT_FAILURE);
}
if (WIFEXITED(status)) {
fprintf(stderr, "exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
fprintf(stderr, "killed by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
fprintf(stderr, "stopped by signal %d\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
fprintf(stderr, "continued\n");
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
if (WIFEXITED(status) && WEXITSTATUS(status) == 111)
return 111;
return EXIT_SUCCESS;
}
}
int
main(int argc, char *argv[])
{
while (111 != createChild(argc, argv)) {
}
}