2010-03-16 32 views
7

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.

+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(); ' –

+0

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. –

Trả lời

3

Tôi nghĩ bạn cần chuyển hướng chính xác luồng đầu ra. Trong ứng dụng của tôi một cái gì đó như thế này hoạt động:

[...] 

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(); 

[...] 

Nếu không có chuyển hướng stdout sẽ không đi đâu nếu tôi nhớ chính xác. Nó là một thực hành tốt để chờ cho quá trình kết thúc nếu bạn muốn có được toàn bộ đầu ra.

EDIT:

Tôi đang sử dụng Linux với phiên bản cũ của boost.process. tôi nhận ra rằng mã của bạn tương tự như đoạn mã tôi đã đưa cho bạn. Các c.wait() có thể là chìa khóa ...

EDIT: Boost.process 0,1 :-)

1

Nếu chuyển sang các "mới nhất" boost.process không phải là một vấn đề (như bạn chắc chắn biết , có một số biến thể cho thư viện này), bạn có thể sử dụng sau đây (http://www.highscore.de/boost/process0.5/)

file_descriptor_sink sink("stdout.txt"); 
execute(
    run_exe("test.exe"), 
    bind_stdout(sink) 
); 
Các vấn đề liên quan