当我从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窗口之后才会输出信息消息,也就是说,只有在进程结束之后。
//
// 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;
}
对不起,我错了,没有立即张贴最低限度的可重复的例子。也许,我应该结束这个问题,创造一个新的一次,这样更多的人可以看到它?
发布于 2022-05-14 10:25:17
在您的程序中,QProcess
将像在终端中输入的那样执行以下命令:
为了更好地查看结果,我在Qt的Run部分的终端中进行了检查:
,所以我在Qt中这样做,并在代码中添加了一些更改:
#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秒才能显示结果,但这是我的结果:
https://stackoverflow.com/questions/72232795
复制相似问题