首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未收到QProcess和QLocalSocket - IPC消息

未收到QProcess和QLocalSocket - IPC消息
EN

Stack Overflow用户
提问于 2019-04-01 11:00:23
回答 1查看 972关注 0票数 3

遵循财富客户示例。

有一个QLocalServer子类,它使用Qprocess启动另一个应用程序(客户机),这个客户机将使用QLocalSocket发送一些消息。只有来自客户端的第一条消息出现在主(服务器)应用程序中,只有在客户端进程退出时才出现。

服务器应用程序:

localserver.h

代码语言:javascript
复制
#ifndef LOCALSERVER_H
#define LOCALSERVER_H

#include <QLocalServer>

class LocalServer : public QLocalServer
{
    Q_OBJECT

public:

    explicit LocalServer(QObject* prnt = nullptr);
};

#endif // LOCALSERVER_H

localserver.cpp

代码语言:javascript
复制
#include "localserver.h"

#include <QLocalSocket>
#include <QDebug>

LocalServer::LocalServer(QObject* prnt)
    : QLocalServer(prnt)
{
    connect(this, &QLocalServer::newConnection, this, [&]() {
        qDebug() << "Socket connected";
        QLocalSocket* socket = this->nextPendingConnection();
        connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater);
        connect(socket, &QLocalSocket::readyRead, [&, socket]() {
            qDebug() << socket->readAll();
        });
    });
}

main.cpp (服务器)

代码语言:javascript
复制
#include <QCoreApplication>
#include <QProcess>

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

    LocalServer::removeServer("testServer");
    LocalServer server;

    if (server.listen("testServer")) {
        QProcess process;
        process.setProgram("/home/ram/work/build/QtExamples/build-LocalSocketClient-Qt_5_12_1_Desktop-Debug/LocalSocketClient");
        process.start();

        if (process.waitForStarted() && process.waitForFinished()) {
            a.exit(0);
        }
    }

    return a.exec();
}

客户端应用:

main.cpp (客户)

代码语言:javascript
复制
#include <QCoreApplication>

#include <QLocalSocket>
#include <QTimer>
#include <QDebug>

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

    QLocalSocket localSocket;

    QObject::connect(&localSocket, &QLocalSocket::connected, &localSocket, []() {
        qDebug() << "Socket connected";
    });

    localSocket.setServerName("testServer");
    localSocket.connectToServer();

    if (localSocket.waitForConnected()) {
        qDebug() << "Connected!";
        auto timer = new QTimer(qApp);
        QObject::connect(timer, &QTimer::timeout, &localSocket, [&localSocket]() {
            static int msgCount(0);
            QString msg(QString("Message from client %1").arg(++msgCount));
            qDebug() << localSocket.write(msg.toLatin1()) << msg;

            if (msgCount > 5) {
                qApp->exit(0);
            }
        });
        timer->start(1000);
    } else {
        return 1;
    }

    return a.exec();
}

当我单独运行两个应用程序(即在服务器应用程序中没有Qprocess部件的main.cpp中)时,我会看到以下输出。

代码语言:javascript
复制
Socket connected
"Message from client 1"
"Message from client 2"
"Message from client 3"
"Message from client 4"
"Message from client 5"

使用QProcess,所有五条消息都同时出现。

代码语言:javascript
复制
Socket connected
"Message from client 1Message from client 2Message from client 3Message from client 4Message from client 5"

我在这里有遗漏什么吗?QProcess还需要更多信息吗?

另外,我也尝试过使用system()函数--它的行为也是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 14:58:20

永远不要使用waitXXX方法,因为它们阻止发送信号的事件循环。在您的示例中,数据是一个接一个地获取的,但由于没有人使用该信息,因为信号没有被传输,因此它在缓冲区中积累,并且只在未阻止事件循环显示所有文本时显示。因此,在您的情况下,解决方案不是使用waitXXX,而是使用信号:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    LocalServer::removeServer("testServer");
    LocalServer server;

    if (server.listen("testServer")) {
        QProcess process;
        process.setProgram("/home/ram/work/build/QtExamples/build-LocalSocketClient-Qt_5_12_1_Desktop-Debug/LocalSocketClient");
        process.start();
        QObject::connect(&process, QOverload<int>::of(&QProcess::finished), &QCoreApplication::quit);
        return a.exec();
    }
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55453576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档