Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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,我在Qt程序代码中使用了以下命令以避免打开第二个实例: #include "mainwindow.h" #include <QApplication> #include <QSharedMemory> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); const char* MEM_KEY = "42";

我在Qt程序代码中使用了以下命令以避免打开第二个实例:

#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

        const char* MEM_KEY = "42";

        QSharedMemory sharedMem(MEM_KEY);

        if (sharedMem.create(1024)) 
        {
            qDebug() << "Create shared memory";
        } 
        else 
        {
            if (sharedMem.error() == QSharedMemory::AlreadyExists) 
            {
                qWarning() << "Already create. Exiting process";
                return 1;
            }
        }
        MainWindow w;
        w.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
        w.show();
        return a.exec();
#包括“mainwindow.h”
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
常量字符*MEM_KEY=“42”;
QSharedMemory sharedmemm(MEM_KEY);
if(sharedMem.create(1024))
{
qDebug()可用于此目的。例如:

int main(int argc, char *argv[])
{
    QtSingleApplication a(argc, argv);
    if (a.isRunning())
    {
        a.sendMessage("42");
        qWarning() << "Already create. Exiting process";
        return 1;
    }

    MainWindow w;
    a.setActivationWindow(&w);
    QObject::connect(&a, SIGNAL(messageReceived(QString))
                     , &w, SLOT(onMessageReceived(QString)));
    w.show();

    int ret = a.exec();
    QObject::disconnect(&a, 0, &w, 0);
    return ret;
}
您正在寻找(进程间通信),遗憾的是,除了创建套接字和侦听
127.0.0.1
之外,我认为没有一种可移植的方法来实现这一点。但是如果您使用的是unix,我建议您使用qdbus。这就是所有酷linux程序都在做的;)

在windows上,我相信也有类似的东西。(但这些都不是内置在qt中的。)您可以找到窗口的句柄(
HWND
)并使用它。 要发送自定义消息,您必须通过以下方式声明自己的
WM_SECONDINSTANCE
(或类似内容):

或者使用枚举(我很懒)。 这会告诉您的现有实例另一个实例已经打开。要在qt中处理它,请查看

要查找
HWND
,我只需将它放在您的第一个实例的共享内存中。
(我的windows知识有点生疏,很抱歉有任何错误)

你能解释一下吗?我是Qt的初学者,我不明白你的代码在做什么。“它工作”。什么工作?我的意思是“避免打开第二个实例”,你通常不必做任何事情(…除了不打开第二个实例)我在代码中没有看到任何其他实例。我已经编辑了我的帖子。你现在理解了吗?我不是100%确定。当程序第一次启动时,你是否…用一个键(42)创建一些共享内存。当它第二次创建时,创建这个共享内存将失败(因为它已经存在)然后你退出应用程序…?如果是,我有两条评论:1)如果其他应用程序已经用相同的键创建了一些共享内存,该怎么办?2)你不能使用这个共享内存来传递消息吗?请检查@Amartel answer。它解决了我的问题。我的代码不好:/我会检查这个,稍后我会告诉你它是否对我有帮助。谢谢男人:D图书馆真不错!我的问题解决了。
void MainWindow::onMessageReceived(const QString &message)
{
    // Do stuff
}
#define WM_SECONDINSTANCE WM_USER
#define WM_SOMEOTHERMESSAGE WM_USER+1