当用户在运行程序的Posix / Linux shell中命中 Ctrl + C 时,该程序会收到SIGINT信号。当运行基于GApplication的程序时,这意味着程序立即终止。
如何克服这个问题并让GApplication优雅地关闭?
答案 0 :(得分:3)
您可以使用g_unix_signal_add()
。此函数接受一个程序收到您指定的信号后调用的回调。 (在这种情况下为SIGINT)
然后该回调应调用g_application_release()
,直到GApplication的使用计数降至零。一旦出现这种情况,主循环将终止,并且将发出GApplication的shutdown
信号。通过处理该信号,您可以在程序终止之前执行所有必要的取消初始化任务。
(摘自reference manual :)
GApplication通过维护主应用程序实例的“使用计数”来提供方便的生命周期管理。可以使用g_application_hold()和g_application_release()更改使用计数。如果它降至零,则应用程序退出。 GtkApplication等高级类使用use count来确保应用程序保持活动状态,只要它有任何打开的窗口。
Vala中的一个例子:
public class MyApplication : Application {
public MyApplication () {
Object (flags: ApplicationFlags.FLAGS_NONE);
startup.connect (on_startup);
activate.connect (on_activate);
shutdown.connect (on_shutdown);
Unix.signal_add (
Posix.SIGINT,
on_sigint,
Priority.DEFAULT
);
}
private bool on_sigint () {
release ();
return Source.REMOVE;
}
private void on_startup () {
print ("Startup\n");
}
private void on_activate () {
print ("command line\n");
hold ();
}
private void on_shutdown () {
print ("Shutdown\n");
}
}
void main (string[] args) {
new MyApplication ().run ();
}
(使用valac foo.vala --pkg gio-2.0 --pkg posix
编译)