1

这不应该是一个不寻常的问题,但我在谷歌或其他搜索机器上找不到任何相关信息。

因此,我使用 C++ 和 QtCreator 制作了一个应用程序。我为应用程序的项目文件创建了一个新的 mime 类型。我的系统(ubuntu 10.10),当我右键单击一个文件并选择“使用'默认应用程序'打开”时,它运行

代码:

default_application path/to/the/selected/file1

因此,如果您选择多个文件并选择“使用‘默认应用程序’打开”,系统将调用

代码:

default_application path/to/the/selected/file1
default_application path/to/the/selected/file2
default_application path/to/the/selected/file3

所以,这对我来说是个大问题,因为我从程序内部处理并发进程,所以当程序的另一个实例运行时,会出现警告消息。因此,每个应用程序的调用都会将其他应用程序识别为当前正在运行的应用程序,因此它会显示消息。我最终会收到 3 条消息,说程序的另一个进程正在运行 --_--' 我的应用程序以这种方式处理多个 URL:

代码:

myapp path/to/the/selected/file1 path/to/the/selected/file2 path/to/the/selected/file3

如何让我的代码同时处理所有这些多个实例?我尝试过的一切都失败了,因为我尝试过的一切都需要从第一个调用的实例中进行检查,这太慢了,其他实例来自应用程序,并且一起警告同一程序的并发进程

那么,我该如何解决这个问题?它取决于系统,还是我可以对代码做些什么?

4

1 回答 1

1

方法是让您的应用程序认识到已经有一个实例正在运行,并让新实例在死前将请求转发给第一个实例:)


编辑:

这样做的方法是让您的第一个应用程序实例充当服务器。伪算法类似于:

start();

try_to_contact_master_server_instance();
if(no_master())
{
    I_am_master();
    start_listening_server_that_wait_for_requests();
}
else
{
    send_request_to_master("open file path/to/the/selected/file1");
    send_request_to_master("open file path/to/the/selected/file2");
    send_request_to_master("open file path/to/the/selected/file3");
    die();
}

handle_incoming_requests();

我希望它更清楚?告诉我您是否需要更多精度...

对于服务器部分,您可以自己做或使用操作系统提供的一些软件总线,如 dbus 或其他任何东西,但它当然会使您的应用程序依赖。

my2c

于 2011-02-07T12:52:23.743 回答