У меня есть приложение, которое выдает МНОЖЕСТВО операций командной строки (например, на «консоли») из разных потоков. Для этого я использую 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) действительно просто, и я не хочу усложнять вещи без причины.
Да, «Преждевременная оптимизация - корень всего зла». Я не пытаюсь это сделать. Эту систему нужно масштабировать.
Мысли