首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QProcess没有发出信号准备好

QProcess没有发出信号准备好
EN

Stack Overflow用户
提问于 2022-05-13 16:34:28
回答 1查看 166关注 0票数 2

当我从shell中启动xfreerdp进程时,它会将信息消息打印到stdout,并向stderr输出警告/错误消息(这只是默认/日志级别: INFO模式)。

但是,当我通过QProcess启动它时,QProcess只使用readyReadStandardError()发出信号,即允许我读取警告/错误消息,但从不使用readyReadStandardOutput()发出信号。只有当进程结束时(我关闭xfreerdp窗口),信号由QProcess发出,所有的stdout都由我读取(我不知道,它一直保存在哪里?)

我发现有关这个问题有两个题目:

我尝试了那里提出的解决方案:

1)。我尝试使用QIODevice::ReadWrite | QIODevice::Unbuffered作为QProcess::start()的第三个参数。它没有帮助--和链接描述的一样。

2)。我试图每100 to使用QProcess::readAllStandardOutput()调用一次QTimer。但是,当我以这种方式读取时,输出字节数组总是为空(直到进程完成)。因此,同样的,由链接告诉,它没有帮助。

当我用QProcess和/log-level:debug/log-level:trace启动xfreerdp时,问题就不存在了。我收到信号表明斯德奥特准备好了。但是有大量的调试/跟踪消息。

我在寻找解决问题的方法。但是如果我找不到它,我有两个选项:要么使用默认的/log-level:info选项,要么使用/log-level:debug选项。对我来说,第一个更好,但我担心所有的stdout都卡在某个地方了,我会遇到一些缓冲区溢出的情况,整个过程都会崩溃,或者就像内存泄漏一样(也许,我会尝试探索QProcess源代码)。第二个可能是更好的选项,但是xfreerdp的调试模式实在太冗长了。

具有最小可重现性示例的更新:

唉,我们需要一个vm来连接。

如果启动这个示例(我已经检查了Fedora 35和Fedora 33),就会看到xfreerdp只有在关闭xfreerdp窗口之后才会输出信息消息,也就是说,只有在进程结束之后。

代码语言:javascript
运行
复制
//
// main.cpp 
// g++ -o main main.cpp -std=c++11 -I/usr/include/qt5 -L/usr/lib64 -lQt5Widgets -lQt5Core
//
#include "QtWidgets/QApplication"
#include "QtCore/QProcess"

int main(int argc, char* argv[])
{
    QApplication app{argc, argv};
    QProcess p;

    QObject::connect(&p, &QProcess::readyReadStandardOutput, [&](){
        printf("%s", p.readAllStandardOutput().constData());
    });

    p.start("xfreerdp", {"/u:user", "/p:123456", "/v:10.38.31.133", "/cert:tofu"});

    app.exec();

    return 0;
}

对不起,我错了,没有立即张贴最低限度的可重复的例子。也许,我应该结束这个问题,创造一个新的一次,这样更多的人可以看到它?

EN

回答 1

Stack Overflow用户

发布于 2022-05-14 10:25:17

在您的程序中,QProcess将像在终端中输入的那样执行以下命令:

为了更好地查看结果,我在Qt的Run部分的终端中进行了检查:

,所以我在Qt中这样做,并在代码中添加了一些更改:

代码语言:javascript
运行
复制
#include "QtWidgets/QApplication"
#include "QtCore/QProcess"

int  main(int argc, char *argv[])
{
    QApplication  app { argc, argv };
    QProcess     *p = new QProcess();
    QStringList   pArgs;

    pArgs << "/u:user" << "/p:123456" << "/v:10.38.31.133" << "/cert:tofu";

    p->setProgram(QString("xfreerdp"));
    p->setArguments(pArgs);

    p->start();

    QObject::connect(p, &QProcess::readyReadStandardOutput, [&]()
    {
// printf("%s", p->readAllStandardOutput().constData());
        qDebug() << p->readAllStandardOutput().constData() << Qt::endl;
    });

    app.exec();

    return 0;
}

您应该使用参数到QProcess,使用QStringList

在我测试时,延迟15到16秒才能显示结果,但这是我的结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72232795

复制
相关文章

相似问题

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