我的目的是:
在主程序里调用"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发过来的输出了.
最后来张图纪念一下这个下午吧: