Jump to content

Archive:Development/Architecture/KDE4/Starting Other Programs (zh CN)

From KDE TechBase


KDE 架构 - 程序启动

KDE中有许多启动程序的方法。这里列举了一些你应该和不应该用的方法。

fork + exec

不要用他们,除非你有很好的理由,KProcess不能完成你想的工作。

KProcess

只有在你要启动一个子进程的时候,才使用KProcess。这时候你要捕捉系统输出或者错误,或者由系输入的数据。这不是启动KDE应用程序的方法,除非你在调试。

KToolInvocation::startServiceByDesktopPath

建议用KToolInvocation::startServiceByDesktopPath来启动桌面应用(KDE/Gnome/X)或者KDE服务。桌面应用或服务应又一个.desktop文件,你的知道这个文件名。 KToolInvocation经DBUS通知KLauncher进程开始应用程序。

Klauncher

如果.desktop文件指定了X-DBUS-StartupType键,那KLauncher将一直等到应用程序注册到DBUS上。一旦startServiceByDesktopPath返回,DBUS就会对应用程序调用起来 而不必担心竞争问题。注意:KLauncher需要知道应用程序使用哪个名字在DBUS注册的,通常,他是org.kde.binaryname, 但你也可以在.desktop文件里设置X-DBUS-ServiceName值。如果你不这么做,KLauncher会抛出一个错误,说这个应用程序启动不了,因为所期望的DBUS名字就没出现过。

kdeinit

KLauncher利用KDEinit来提高启动性能和降低内存使用。这只适用于KDEinit可用模块(KLM)。

KRun

打开文件、应用程序、Shell命令的通用方法。尽可能使用startServiceByDesktopPath方法,会有更多的启动优势。KRun可以启动任何程序,从二进制文件到桌面文件。在运行之前,他会自动判断文件的MIME类型从而调用合适的处理方式,同样这适用于Shell命令。这些特性就是我们建议使用KRun在KDE调用程序的原因。

KToolInvocation::invokeBrowser

KToolInvocation::invokeBrowser 将加载浏览器。 相对于KRun,他会首先根据MIME类型决定如何加载(如果是HTTP,那么他会现下载,在调用相应程序加载。)。如果你事先就知道他是HTML网页,直接用invokeBrowser会快很多。

更多内容: 对KRun来说,网页因该在浏览器里显示,如果用户所选的浏览器是非KDE应用程序, 象火狐(Firefox)等,系统不得不启动另一轮下载来得到该网页,而Konqueror就可以利用KRun所设定的kioslave。另一方面,如果URL是一幅图像或其他的,反正不是网页,那KRun就是个合理地选择了,合适的应用程序会启动的。