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

时间:2011-12-19 03:58:25

标签: c++ multithreading performance qt process

我有一个应用程序从不同的线程发出大量的命令行操作(例如,在“控制台”)。为此,我使用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...

这也很好。

所以,我正在比较两个设计选项:

  1. 每次都实例化QProcess除了单个命令行调用外,不再重复使用。简单。

  2. 重新使用QProcess执行“记住”哪个QProcess实例已设置QProcessEnvironment的工作,所以我可以在适当的环境中运行命令。更快(没有QProcess的重新实例化,没有重新设置QProcessEnvironment()),但需要更多的“簿记”。

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

    重要?我需要在许多线程上执行数千个命令行操作。如果它是“大”,那引导我走向(2)(可行,我已经弄明白了)。否则,(1)非常简单,我不想无缘无故地复杂化。

    是的,“过早的优化是所有邪恶的根源。”我不是想这样做。该系统需要大规模扩展。

    思想?

1 个答案:

答案 0 :(得分:-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();

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