设计:重用 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 实例,还是再次实例化?的主要内容,如果未能解决你的问题,请参考以下文章