• 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发过来的输出了.
    最后来张图纪念一下这个下午吧:





  • 相关阅读:
    [][]
    Spark笔记04
    Spark笔记03
    Spark笔记02
    Spark笔记01
    【熟能生巧】使用Screw快速生成数据库文档
    记一次关于jdbcTemplate.queryForList快速Debug及感悟
    【从零单排】Exception实战总结1
    【从零单排】Java性能排查实战模拟
    【从零单排】关于泛型Generic的一些思考
  • 原文地址:https://www.cnblogs.com/chaoswong/p/3605320.html
Copyright © 2020-2023  润新知