Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使应用程序在Qt中打开新文件时不运行新实例?_C++_Qt - Fatal编程技术网

C++ 如何使应用程序在Qt中打开新文件时不运行新实例?

C++ 如何使应用程序在Qt中打开新文件时不运行新实例?,c++,qt,C++,Qt,例如,我们有一个TextEditor应用程序。比如记事本++。我们有显示文件内容的选项卡。 操作系统中的默认文本编辑器设置为TextEditor应用程序。当我们打开一个新文件时,应用程序添加了一个选项卡并将内容放入其中。 如何使应用程序在Qt中打开新文件时不运行新实例? 您认为哪种方式最好?问题是如何创建单实例应用程序。打开文件时,操作系统将打开关联的应用程序,并将该文件作为命令行参数提供给它。您不能简单地通过操作系统机制将“打开文件”命令委托给正在运行的应用程序,您必须自己实现它 在AppWh

例如,我们有一个TextEditor应用程序。比如记事本++。我们有显示文件内容的选项卡。
操作系统中的默认文本编辑器设置为TextEditor应用程序。当我们打开一个新文件时,应用程序添加了一个选项卡并将内容放入其中。
如何使应用程序在Qt中打开新文件时不运行新实例?

您认为哪种方式最好?

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

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

这是解决这个问题的一个解决方案,需要相当多的编码,如果您不想将本地客户机/服务器通信用于其他任何事情,我不建议使用它,但这是一个可行的解决方案

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

或者,作为第三种选择,您可以使用第三方解决方案,如@Matteo Italia。请查看。