• 10645阅读
  • 8回复

[提问]QProcess 使用问题 [复制链接]

上一主题 下一主题
离线quser
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-04
类信号 void readyReadStandardOutput()  是在进程标准输出达到一定程度后才发射,  
我通过QProcess启动的程序在输出一小段标准输出后会停止输出标准输出,不能满足发射信号void readyReadStandardOutput()  的程度
1.我能否设置这个缓冲区
2.什么办法能够在标准输出没有到达一定程度就能获取里面的信息
离线dbzhang800

只看该作者 1楼 发表于: 2011-11-04
你调用的那个程序,需要禁止掉自己的缓冲

http://blog.csdn.net/dbzhang800/article/details/6876451
离线zhy282289
只看该作者 2楼 发表于: 2011-11-04
学习了
为什么我脸这么胖~
离线quser
只看该作者 3楼 发表于: 2011-11-05
回 1楼(dbzhang800) 的帖子
按照您说的方法  我禁用了stdout的缓冲区  但是还是达不到我想要的效果  
依旧是只有当printf输出的数据达到了一定程度,readallstandout()才会读到东西

下面是代码片段
//启动了个定时器 每200ms调用freshUI();
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(freshUI()));
timer->start(200);

//读取标准输出追加到界面上
QString outputText = process->readAllStandardOutput();   //读取标准输出
if(outputText.simplified()!= "")
{
      saveToText(outputText);        //标准输出追加保存到文本中
   ui.teLog->append(outputText);  //界面上显示标准输出
}


//启动进程 禁用缓冲区(不知道具体加到哪里,所以前后都加了)
setvbuf(stdout, (char *)NULL, _IONBF, 0);

if(perlFileName.endsWith(".EXE")||perlFileName.endsWith(".exe"))
        process->start(perlFileName); //运行perl脚本
else
        //解决参数中路径存在空格的问题
    process->start("perl.exe",QStringList()<<perlFileName); //运行perl脚本
    setvbuf(stdout, (char *)NULL, _IONBF, 0);

离线dbzhang800

只看该作者 4楼 发表于: 2011-11-05
禁用 被调用的程序的缓冲

离线quser
只看该作者 5楼 发表于: 2011-11-05
回 4楼(dbzhang800) 的帖子
麻烦能说的细一些么  我起的进程您也应该看到了 perl.exe程序,这个程序不是我编写的 , 我怎么能禁用perl.exe 的程序的缓冲
离线dbzhang800

只看该作者 6楼 发表于: 2011-11-05
Re:回 4楼(dbzhang800) 的帖子
引用第5楼quser于2011-11-05 11:29发表的 回 4楼(dbzhang800) 的帖子 :
麻烦能说的细一些么  我起的进程您也应该看到了 perl.exe程序,这个程序不是我编写的 , 我怎么能禁用perl.exe 的程序的缓冲


我对perl不了解,可能你去perl相关的论坛或邮件列表更容易得到答案。

下面是关于Python的,可能对你有参考作用:
1.  可以设置环境变量: PYTHONUNBUFFERED
2.  可以给python传递命令汗参数 -u
3.  可以代码内使用一个wapper,包装sys.stdout,使得每次都会flush
4.  可以代码内使用dlopen,重新用非缓冲的方式打开标准输出
5 ...
离线quser
只看该作者 7楼 发表于: 2011-11-05
回 6楼(dbzhang800) 的帖子
谢谢您的回答 要是通过QProcess这个类能设置 我要启动的程序的标准输出缓冲区就好了  perl其实我也不咋熟 呵呵 再研究研究
离线lastagile

只看该作者 8楼 发表于: 2014-01-18
这个问题有解决吗?
快速回复
限100 字节
 
上一个 下一个