我有一个应用程序从不同的线程发出大量的命令行操作(例如,在“控制台”)。为此,我使用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)非常简单,我不想无缘无故地复杂化。
是的,“过早的优化是所有邪恶的根源。”我不是想这样做。该系统需要大规模扩展。
思想?
答案 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();
使用这种方法,写通道保持打开状态,您可以在进程查询输入时做出反应。