如果窗口关闭,是否可以运行后台进程?

时间:2010-09-17 08:46:38

标签: c++ gtk

我正在用c ++ gtk创建一个应用程序,如果按下按钮,线程进程将启动,如果窗口关闭,我需要运行应用程序吗?

2 个答案:

答案 0 :(得分:0)

在Windows上,您需要创建Windows/Linux/Mac Servicerun the process in background。在Linux上,您需要创建daemon servicerun the process in background。服务允许在引导时自动启动进程。

答案 1 :(得分:0)

在Unix系统上(从Windows 10开始),您可以使用fork()函数创建另一个进程。要运行程序,请使用execve()或类似名称。

但是,这意味着您需要使用管道(请参见pipe()pipe2())或通过网络与其他进程进行通信。

使用线程而不是进程可以使您在同一内存和进程中运行,并且可以轻松地在多个线程之间共享所有内容。

据我所知,一旦用户选择“关闭窗口”或类似的退出功能,gtk循环就会返回。您的main()函数将确保退出之前等待所有线程完成。对于线程,通常使用“ join()”来完成。这将取决于您用于运行后台进程的库。

请注意,在大多数情况下,人们希望每当要求流程退出时,流程就会退出。对于运行GUI的进程,最好显示一个窗口,指出您的进程仍在后台运行(忙)。特别是,如果您从控制台运行您的进程,则关闭窗口后该进程不会立即退出,因此让用户知道正在发生的事情很重要,否则他们可能会按 Ctrl-C 并杀死该进程。整个事情。

如果您希望主线程返回但又能保持后台线程运行,则稍微复杂一点,但是它使用了我刚才提到的两种解决方案:

  1. 创建一个pipe()
  2. fork()(但没有execve()
  3. 在分叉的应用程序中
  4. 。 (子级)打开Gtk窗口,后台线程等。
  5. 关闭最后一个Gtk窗口时,通过管道发送消息
  6. 父进程收到消息并立即退出
  7. 子进程仍尝试使用“ join()”来等待后台线程

这样,具有在(3)中创建的线程的后台进程可以继续运行(您的函数仍然需要等待所有线程以“ join()”结尾),但是,使用感觉“应用已完成”,因为即使后台进程仍在运行,它也会返回到控制台提示中的下一行。

如果您不希望应用程序始终在后台运行,则不需要pipe()并在pipe()上等待消息。

注意:在创建要在后台运行的进程(即服务,在Unix下通常称为服务器)时,最常见使用fork()。这就是他们将PPID设置为1的方式。