1

例如,我们有一个 TextEditor 应用程序。像记事本++。我们有显示文件内容的选项卡。
OS 中的默认文本编辑器设置为 TextEditor Application。当我们打开一个新文件时,应用程序添加了一个选项卡并将内容放入其中。
在 Qt 中打开新文件时如何使应用程序不运行新实例?
你认为最好的方式是什么?

4

1 回答 1

0

问题是如何制作单实例应用程序。当您打开文件时,操作系统将打开关联的应用程序并将文件作为命令行参数提供给它。您不能简单地通过操作系统机制将“打开文件”命令委托给正在运行的应用程序,您必须自己实现它。

在 AppWhirr 项目中,我们使用 QLocalServer/Client 在实例之间进行通信:当 AppWhirr 应用程序执行时,它会检查是否已使用具有修复 ID 的 QLocalServer。如果不是,则此应用程序实例是第一个/唯一运行的实例。如果 ID 已被占用,则意味着应用程序的另一个实例已经在运行,因此第二个实例只会做两件事:通过 Qt 的本地客户端/服务器通信将给定的输入参数发送到另一个实例,以及当它成功完成通信时它将退出(第二个实例)。

这是该问题的一种解决方案,需要大量编码,如果您不想将本地客户端/服务器通信用于其他任何事情,我不会推荐它,但它是一个可行的解决方案。

另一种解决方案是应用程序的第一个实例在固定位置创建一个文本文件并写入我们实例的 ID。在此之后,第二个实例可以读取文本文件并向指定的 ID 发送消息。当然,第一个实例必须在退出时删除文本文件,并且可能您必须实施一些故障安全代码来删除文本文件,以防第一个实例崩溃。此解决方案将使用比第一个解决方案更少的资源,但需要故障安全清理代码。

或者作为第三种选择,您可以使用@Matteo Italia 建议的第三方解决方案。

于 2012-08-13T07:59:55.830 回答