Hiện tại, tôi đang sử dụng Boost.Process từ hộp cát Boost và đang gặp phải sự cố khi bắt đầu sản phẩm chuẩn của mình; tự hỏi nếu ai đó có thể cho tôi một cặp mắt thứ hai vào những gì tôi có thể làm sai.Không thể ghi lại đầu ra tiêu chuẩn của quá trình bằng cách sử dụng Boost.Process
Tôi đang cố chụp hình thu nhỏ từ các hình ảnh máy ảnh RAW bằng DCRAW (phiên bản mới nhất) và chụp chúng để chuyển đổi thành QT QImage's.
Chức năng quá trình khởi động:
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++;
}
}
Gọi bộ chuyển đổi:
DCRawInterface DcRaw;
DcRaw.convertRawImage("test/CFK_2439.NEF");
Mục đích là để chỉ đơn giản là kiểm tra xem tôi có thể sao chép các dòng đầu vào cho một tập tin đầu ra.
Hiện nay, nếu tôi nhận xét ra các dòng sau:
args.push_back("-c");
thì thumbnail được viết bởi Dcraw vào thư mục nguồn với một tên của CFK_2439.thumb.jpg, trong đó chứng minh với tôi rằng quá trình này là nhận được viện dẫn với các đối số đúng. Điều gì không xảy ra là kết nối với đường ống đầu ra đúng cách.
FWIW: Tôi đang thực hiện thử nghiệm này trên Windows XP theo Eclipse 3.5/Mới nhất MingW (GCC 4.4).
[UPDATE]
Từ gỡ lỗi, có thể thấy rằng vào thời điểm mã đạt streamcopy, các tập tin/ống đã được đóng cửa - byte = input.readsome (...) không bao giờ là bất kỳ giá trị khác hơn 0.
có lẽ không phải là vấn đề chính, nhưng 'output''ofstream' nên được mở trong chế độ nhị phân. Ngoài ra: 'streamcopy' có thể được đơn giản hóa thành' out << input.rdbuf(); ' –
Cuộc gọi tốt trên input.rdbuf(). Tôi đã thực sự sử dụng nó trước khi tôi viết streamcopy để xem những gì đang xảy ra dưới mui xe. –