0

あるパイプからEXRのストリームを読み取り、それらを処理して、結果を別のパイプに書き込もうとしています。この場合、それらはパイプと呼ばれますが、stdinとstdoutでもかまいません。

私の問題は、パイプが枯渇したときに発生します。OpenEXRは何も読み取ろうとするのが好きではなく、次のスタックトレースでクラッシュします。

(gdb) run in.exr out.exr
Starting program: /Users/jon/Library/Developer/Xcode/DerivedData/compressor-abhdftqzleulxsfkpidvcazfowwo/Build/Products/Debug/compressor in.exr out.exr
Reading symbols for shared libraries +++++++++......................................................................................................... done
Reading symbols for shared libraries ............ done
Reading symbols for shared libraries . done
Reading symbols for shared libraries . done
terminate called throwing an exception
Program received signal SIGABRT, Aborted.
0x00007fff90957ce2 in __pthread_kill ()
(gdb) backtrace
#0  0x00007fff90957ce2 in __pthread_kill ()
#1  0x00007fff866f27d2 in pthread_kill ()
#2  0x00007fff866e3a7a in abort ()
#3  0x00007fff8643c7bc in abort_message ()
#4  0x00007fff86439fcf in default_terminate ()
#5  0x00007fff844d61cd in _objc_terminate ()
#6  0x00007fff8643a001 in safe_handler_caller ()
#7  0x00007fff86439fed in unexpected_defaults_to_terminate ()
#8  0x00007fff8643a040 in __cxxabiv1::__unexpected ()
#9  0x00007fff8643aefe in __cxa_call_unexpected ()
#10 0x0000000100008cfb in exr::ReadEXR (pixelBuffer=@0x7fff5fbfee00, is=@0x7fff5fbfeef8) at /Users/jon/Development/compressor/compressor/exr.cpp:47
#11 0x0000000100001c39 in main (argc=4, argv=0x7fff5fbffaa8) at /Users/jon/Development/compressor/compressor/main.cpp:79

より多くのデータが利用可能になるまでOpenEXRがスレッドをブロックすることを本当に望んでいますが、ある程度堅牢である限り、手動でチェックして、より多くのデータがあるかどうかを確認する方法があった場合。

ありがとう。

4

1 に答える 1

0

この問題の解決策は、実際にImf :: Istreamを拡張し、入力パイプが枯渇したときにブロックするように実装することです。

この特定の問題については、パイプを探すことができず、パイプの位置がわからないなど、いくつかの考慮事項を考慮する必要がありますが、回避することはできます。

于 2012-07-18T11:52:50.167 に答える