zoukankan      html  css  js  c++  java
  • QProcess怎么实时的读到output的信息

    在Qt里想与子程序通信, 一般都会用到QProcess这个类, 而且手册里也提到了很多通信的方法, 比如手册里的"Communicating via Channels". 我也不例外, 用的也是这货, 但在实际操作中, 还是遇到不少问题....

    我的目的是:
        在主程序里调用"lftp.exe"来将一些文件上传到服务器上.

    貌似很简单啊, 开工吧:
    connect(&_process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadOutput()));
    connect(&_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));

    QString cmd = QString("lftp -c 'open -e "lcd d:/data; mirror -R ./ " admin:admin@localhost'"); 
    _process.start(cmd, QProcess::ReadWrite);

    运行发现, onReadOutput()函数就是不调用, 这要不说明qt有BUG(-____-! 基本不可能), 要不就是我哪里写错了.
    把命令换成 'ping localhost', 发现onReadOutput()可以成功调用, 那应该就是一开始写的命令有问题. 把命令拷出来在命令行里执行, 发现是可以看到输出信息的, 然后大脑就断路了... 这是哪儿的问题啊.

    调了很久, 注意到一个细节, 就是在命令行运行时, 输出的信息是一直在一行里的, 而没有换行, 也就是我们经常写的:
    printf("hello world ");

    这会导致一直不换行, 而在进程间通信的时候, 是以 来作为命令或缓冲区结束的标志的, 所以在我的程序中, 直到程序运行完毕, 也没有触发readyReadStandardOutput信号.

    知道了原因, 就得想解决办法来让主程序可以收到点什么, 好让用户认为上传过程还没死....

    仔细看lftp的帮助后, 发现了-v这个参数...
    -v这个参数是用来输出一些多余的信息的, 而打印多余的信息都是有 结尾的...

    所以最后就把命令改成了:
    QString cmd = QString("lftp -c 'open -e "lcd d:/data; mirror -veR ./ " admin:admin@localhost'"); 

    OK了, 程序可以接收到lftp发过来的输出了.
    最后来张图纪念一下这个下午吧:





  • 相关阅读:
    Pytest --快速入门和基础讲解
    Python并发编程(一):多进程(理论篇)
    【面试出题】三数之和
    python 基础:迭代器、生成器
    python垃圾回收机制
    50道Python面试题集锦
    Web自动化测试框架改进
    linux 三剑客
    函数的参数
    生成器
  • 原文地址:https://www.cnblogs.com/chaoswong/p/3605320.html
Copyright © 2011-2022 走看看