遵循财富客户示例。
有一个QLocalServer子类,它使用Qprocess启动另一个应用程序(客户机),这个客户机将使用QLocalSocket发送一些消息。只有来自客户端的第一条消息出现在主(服务器)应用程序中,只有在客户端进程退出时才出现。
服务器应用程序:
localserver.h
#ifndef LOCALSERVER_H
#define LOCALSERVER_H
#include <QLocalServer>
class LocalServer : public QLocalServer
{
Q_OBJECT
public:
explicit LocalServer(QObject* prnt = nullptr);
};
#endif // LOCALSERVER_Hlocalserver.cpp
#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 (服务器)
#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 (客户)
#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中)时,我会看到以下输出。
Socket connected
"Message from client 1"
"Message from client 2"
"Message from client 3"
"Message from client 4"
"Message from client 5"使用QProcess,所有五条消息都同时出现。
Socket connected
"Message from client 1Message from client 2Message from client 3Message from client 4Message from client 5"我在这里有遗漏什么吗?QProcess还需要更多信息吗?
另外,我也尝试过使用system()函数--它的行为也是一样的。
发布于 2019-04-01 14:58:20
永远不要使用waitXXX方法,因为它们阻止发送信号的事件循环。在您的示例中,数据是一个接一个地获取的,但由于没有人使用该信息,因为信号没有被传输,因此它在缓冲区中积累,并且只在未阻止事件循环显示所有文本时显示。因此,在您的情况下,解决方案不是使用waitXXX,而是使用信号:
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;
}https://stackoverflow.com/questions/55453576
复制相似问题