В настоящее время использую Повышение. Процесс от песочницы Повышения, и имеет проблемы, заставляющие это получать мой стандартный вывод правильно; удивление, если кто-то может дать мне вторую пару глазных яблок в то, что я мог бы делать неправильно.
Я пытаюсь вынуть миниатюры из НЕОБРАБОТАННЫХ изображений камеры с помощью DCRAW (последняя версия) и получить их для преобразования в спокойный QImage's.
Функция запуска процесса:
namespace bf = ::boost::filesystem;
namespace bp = ::boost::process;
QImage DCRawInterface::convertRawImage(string path) {
// commandline: dcraw -e -c <srcfile> -> piped to stdout.
if ( bf::exists( path ) ) {
std::string exec = "bin\\dcraw.exe";
std::vector<std::string> args;
args.push_back("-v");
args.push_back("-c");
args.push_back("-e");
args.push_back(path);
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
bp::child c = bp::launch(exec, args, ctx);
bp::pistream &is = c.get_stdout();
ofstream output("C:\\temp\\testcfk.jpg");
streamcopy(is, output);
}
return (NULL);
}
inline void streamcopy(std::istream& input, std::ostream& out) {
char buffer[4096];
int i = 0;
while (!input.eof() ) {
memset(buffer, 0, sizeof(buffer));
int bytes = input.readsome(buffer, sizeof buffer);
out.write(buffer, bytes);
i++;
}
}
Вызов преобразователя:
DCRawInterface DcRaw;
DcRaw.convertRawImage("test/CFK_2439.NEF");
Цель состоит в том, чтобы просто проверить, что я могу скопировать входной поток в выходной файл.
В настоящее время, если я комментирую следующую строку:
args.push_back("-c");
затем миниатюра записана DCRAW в исходный каталог с названием CFK_2439.thumb.jpg, который доказывает мне, что процесс становится вызванным с правильными аргументами. То, чего не происходит, соединяется с выходным каналом правильно.
FWIW: я выполняю этот тест на Windows XP под Eclipse 3.5/Latest MingW (GCC 4.4).
[ОБНОВЛЕНИЕ]
От отладки казалось бы, что к тому времени, когда код достигает streamcopy, файл/канал уже закрывается - байты = input.readsome (...) никогда не являются никаким значением кроме 0.
Ну, я думаю, вам нужно перенаправить правильно выходной поток. В моем приложении работает примерно так:
[...]
bp::command_line cl(_commandLine);
bp::launcher l;
l.set_stdout_behavior(bp::redirect_stream);
l.set_stdin_behavior(bp::redirect_stream);
l.set_merge_out_err(true);
bp::child c = l.start(cl);
bp::pistream& is = c.get_stdout();
string result;
string line;
while (std::getline(is, line) && !_isStopped)
{
result += line;
}
c.wait();
[...]
Без перенаправления stdout никуда не денется, если я правильно помню. Если вы хотите получить весь вывод, рекомендуется дождаться завершения процесса.
РЕДАКТИРОВАТЬ:
Я использую Linux, возможно, со старой версией boost.process. Я понимаю, что ваш код похож на фрагмент, который я вам дал. C.wait () может быть ключом ...
EDIT: Boost.process 0.1: -)