0

SVG 画像のビットマップとしてのレンダリングをサポートしたいと考えています。librsvg を使用しています。これまでのところ、うまく機能し、Cairo を使用して描画します。万歳! しかし、私は問題に遭遇しました:

Windows Explorer に似たコントロールがあります。たとえば、ディレクトリ内のファイルのサムネイル サイズのイメージを作成するため、製品を拡張して SVG のサムネイルを生成できます。

バックグラウンド スレッドを使用してサムネイル画像を生成するため、動作中に UI がフリーズすることはありません。コードは長い間本番環境にあるため、同時実行の問題に関する限り問題はありません。しかし、メイン スレッド以外のスレッドから rsvg_handle_new() が呼び出されると、アクセス違反が発生するようです。

スタック トレースを見ると、クラッシュは libxml2 (librsvg の依存関係) で xmlSetGlobalState() で発生しているように見えます。問題はここで報告されているものと同じよう です。 . 可能であれば、ライブラリの使用をメイン スレッドに制限しますが、メイン スレッドからサムネイルを生成するこの既存のアーキテクチャにこだわっています。

RsvgHandleの作成中にlibrsvgによって呼び出されるように見える最初のメインスレッドでxmlInitParser()を呼び出すことを提案するhttp://www.xmlsoft.org/threads.htmlを見つけました(私は思います)。

それが本当に libxml2 の問題なのか、librsvg が libxml2 を使用する方法の問題なのか、それとも私が librsvg を使用しようとしている方法の問題なのか、私にはわかりません。

libxml2 または librsvg の専門家はいますか?

4

2 に答える 2

2

malloc() や free() などのメモリ処理の実装は、C < 11 では必ずしもスレッド セーフではないという事実にもかかわらず、共有/グローバル メモリの問題が常に存在します。異なるスレッドでの同じファイルへのファイル ハンドルは、それらが読み取り専用である限り、それほど悪くはありません。

ただし、libxml2 2.4.7 以降では、API レベルで、ドキュメントごとに単一のスレッドに対してスレッド セーフを有効にできる場合があります: http://www.xmlsoft.org/threads.html

libxml2 2.9.1 のソースを見ると、スレッド セーフが完全に実装されていることは確かです。グローバル ミューテックスにも関わらず、アトミック割り当て関数もあります。

ダウンロード: ftp://xmlsoft.org/libxml2

よろしく、ラビ

于 2014-05-17T14:33:04.590 に答える
0

xmlCleanupParser() がコード内または libxml2 を使用する他のライブラリ内で呼び出されないことを 100% 確認してください。プログラム全体でパーサーの使用が残っていないと仮定して、グローバル状態を破棄します。

http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser

ダニエル

于 2013-03-06T06:14:13.237 に答える