Как правило, вы не хотите запускать процесс и накапливать all его вывод в системный канал перед попыткой чтения.Известно, что это вызывает взаимные блокировки, особенно в Windows.
Система накладывает ограничение на размер буфера для канала.Что происходит, так это то, что дочерний процесс (grep) блокирует запись в канал, потому что буфер заполнен.Он ожидает, пока родительский процесс (ваше приложение) прочитает из канала, освобождая место в буфере.Теперь, поскольку ваши приложения находятся в состоянии ожидания блокировки, ожидая завершения процесса, каждое из них ожидает друг за другом.
Поскольку waitForFinish()
по умолчанию ожидает не более 30 секунд, в конце 30секунд, ваше приложение прерывает ожидание блокировки и возвращается, дочерний процесс все еще выполняется, и вы уничтожаете его.
Решением этой проблемы является активный цикл чтения для обработки выходных данных дочернего процесса по мере его создания, обеспечиваясвободное место в буфере и, таким образом, предотвращение взаимоблокировки.
Я не специалист по Qt, поэтому я не уверен, как реализовать этот активный цикл в Qt.Взглянув на документацию для QProcess
, я бы сказал что-то вроде:
// Use resizable buffers, unlike the system.
QByteArray stderr;
QByteArray stdout;
// Give the child process some time to start.
grep.waitForStarted();
do {
// Read all available data on both output streams.
stderr += grep.readAllStandardError();
stdout += grep.readAllStandardOutput();
}
// Wait 100 ms and keep looping if not finished.
while ( !grep.waitForFinished(100) );
// Make sure you catch any leftovers.
stderr += grep.readAllStandardError();
stdout += grep.readAllStandardOutput();
// Do something with the buffers.