QT中调用外部程序的方法

上个月有人写信问我这个问题,当时做了比较详细的回答,把回答内容放上来,也许对其它 人会有些用处的吧。有些地方我的理解可能也不正确,欢迎指正:

问题:
    我做的那个小软件的图形界面是基于QT3.2的,在主界面的命令行编辑框输入命令以后要执行别人已经写好的可执行文件。这些可执行文件执行的时间比较长,在终端上运行时会显示一些运行的信息,最后才显示执行结果。我的界面上有一个文本框,我想把它们在后台执行过程中的信息不断添加到文本框中,相当于实时显示吧,不过要求也不是那么高。

    我说我现在怎么做的吧,我在一个叫做QGUI_CommandWidget类(属于主窗口)中定义了一个命令行编辑框输入命令,定义一个QTextEdit对象用来显示那些执行信息,定义了一个自定义的MyThread类对象用来执行外部程序,在这个线程的run函数里我调用fork,execv函数执行外部程序,把可执行程序的标准输出重定向到管道,然后从管道读那些信息,再把这些信息用QApplication::postEvent()函数传回主线程,由主线程把这些信息append到文本框中。

    我现在的疑问是:
        第一,执行外部程序,用fork、execv函数是不是不行,非要用QProcess不可?为什么呢?论坛上讲的也不是很清楚。具体怎么做呢?在那个QGUI_CommandWidget类创建一个QProcess类对象还是在我MyThread类对象里再创建一个QProcess类对象?
        第二,基于qt3的GUI线程和非GUI线程的通信,应该怎么做?那个外部程序我是不能更改的,它什么时候结束我也不知道。用QProcess的话它的输出信息我要怎么样才能读到然后回显在我的主窗口的文本框中?怎么知道可执行程序结束然后杀死该线程?
        第三,我在《C
++  GUI programming with qt3》中看到:“ QTimer 类以及应用于网络的QFtp, QHttp, QSocket, and QSocketNotifier 类都是基于消息事件循环的,所以也不能用在非GUI线程中。”这是为什么呢?还有我看了别人用QQSocketdevice的例子里都用到了QSocketNotifier。在你的博客说到用Qthread、QQSocketdevice、QWaitCondition可以完成视频采集,你是否也用到QSocketNotifier?

回答:
1 )完全可以使用fork,execv函数,其实QProcess类只是对这些底层函数的封装而
已,但是考虑到使用QProcess的话,不需要自己处理程序管道,也不需要自己处理
windows下的情况,可以省去很多时间,因此还是推荐使用QProcess,他们的效果
将是一样的。

2 )照你的需求,完全可以不需要使用线程,因为QProcess已经自己处理掉这些事
了,在使用QProcess的start函数执行外部程序后,这个函数不会被阻塞,另外
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值