设计:重用 QProcess 实例,还是再次实例化?

Posted

技术标签:

【中文标题】设计:重用 QProcess 实例,还是再次实例化?【英文标题】:Design: Re-use QProcess instance, or instantiate again? 【发布时间】:2011-12-19 03:58:25 【问题描述】:

我有一个应用程序从不同的线程发出大量命令行操作(例如,在“控制台”)。为此,我使用QProcess(Qt C++):

  QProcess* p = new QProcess();
  // ...maybe set QProcessEnvironment, set up stdout/stderr, etc....
  p->start("cmd.exe");
  p->write("dir\n");
  p->closeWriteChannel();
  p->waitForBytesWritten(-1/*forever*/);
  p->waitForReadyRead(-1/*forever*/);
  p->waitForFinished(-1/*forever*/);
  // ...read all text from process

以上工作正常。如果没有QProcess::closeWriteChannel(),我无法让它在任何排列下正常工作,但如果有人知道一个选项,我会很感兴趣(见下文)。

我的理解是,自从我打电话给QProcess::closeWriteChannel(),我永远无法重新打开那个频道。但是,由于我完成了实例化QProcess 和设置QProcessEnvironment 的工作,我只能再次启动该过程(这会重新打开写入通道)。

// ...after previous run:
p->start("cmd.exe");
// ...use it again...

这也很好用。

所以,我比较了两种设计方案:

    每次都实例化 QProcess 除了单次命令行调用外,不得重复使用。很简单。

    重复使用QProcess 执行“记住”哪个QProcess 实例具有哪个QProcessEnvironment 已经设置的工作,这样我就可以在适当的位置运行命令环境。更快(无需重新实例化QProcess,无需重新设置QProcessEnvironment()),但需要更多“记账”。

问题:实例化QProcess 和设置QProcessEnvironment 的运行时开销有多大?

重要吗?我需要跨多个线程执行数千个命令行操作。如果它是“大”的,那会引导我走向(2)(可行,我已经弄清楚了)。否则,(1)真的很简单,我不想无缘无故地把事情复杂化。

是的,“过早的优化是万恶之源。”我不想那样做。该系统需要大规模扩展。

想法?

【问题讨论】:

简单答案:测量它:) 我怀疑重用 QProcess 实例是否值得增加复杂性,因为创建本机进程并实际运行它们会产生更多开销。但只有通过分析才能得到明确的答案。 【参考方案1】:
  QProcess* p = new QProcess();
  // ...maybe set QProcessEnvironment, set up stdout/stderr, etc....
  p->start("cmd.exe");
  p->write("dir\n");
  p->closeWriteChannel();
  p->waitForBytesWritten(-1/*forever*/);
  p->waitForReadyRead(-1/*forever*/);
  p->waitForFinished(-1/*forever*/);
  // ...read all text from process

以上工作正常。我无法让它在任何情况下正常工作 没有 QProcess::closeWriteChannel() 的排列,但我会 如果有人知道一个选项,有兴趣(见下文)。

目前您正在写“\n”作为字符。 您需要将它们写为单个字符。

p->write(QString("dir") + '\n');

而不是

p->write("dir\n");
p->closeWriteChannel();

使用此方法,写入通道保持打开状态,您可以在进程查询输入时做出反应。

【讨论】:

以上是关于设计:重用 QProcess 实例,还是再次实例化?的主要内容,如果未能解决你的问题,请参考以下文章

ObjectPool 对象重用

iPhone iOS 实例化静态 NSString 单元重用标识符的正确方法是啥?

设计模式23模式介绍

可重用的 sparkcontext 实例

JavaScript 设计模式

SAPUI5 重用视图并创建新实例