1

VideoObjectC++ DLL を使用して Web カメラから画像とビデオをキャプチャするクラスがあります。私は、DLL が DirectShow を利用してこれを行うと言われました。また、私が制御できないいくつかの独自のスレッドを開始するようです。

VideoObjectクラス自体は正常に動作しているようです。画像とビデオをキャプチャできます。ただし、その使用はメイン UI のパフォーマンスに悪影響を及ぼします。非常に遅延します。

VideoObjectこのようにインスタンス化すると

public partial class ParentForm : Form

    private VideoObject videoObject;

    public ParentForm()
    {
        videoObject = new VideoObject();
    }
}

その後、UI が非常に遅くなります。の基になる DLL が何をしていてもVideoObject、アプリケーションの UI スレッドに影響を与えていると思います。

VideoObjectこれで、独自の MTA スレッドでインスタンスを開始することで、この遅延を軽減できます。(私は C# に全く慣れていないので、以下はあまり賢くないかもしれないと推測しています。)

public partial class ParentForm : Form

    private VideoObject videoObject;
    private Thread videoObjectThread;

    public ParentForm()
    {
        videoObjectThread = new Thread(new ThreadStart(() => videoObject = new VideoObject()));
        videoObjectThread.SetApartmentState(ApartmentState.MTA);
        videoObjectThread.Start();
    }
}

インスタンスと対話できるvideoObjectようになり、UI が遅れることはありませんが、フォームのコンストラクターでインスタンスをそれ以上参照しない場合に限ります。

フォームのコンストラクターでこのスレッド化されたインスタンスを何らかの方法で操作すると、UI が再び遅延します。Form のコンストラクター内の のインスタンスと直接やり取りするとVideoObject、UI の動作が遅くなるようです。

私が見ている行動について何か洞察を持っている人はいますか?

編集:おそらく「ラグ」の意味を明確にする必要があります。つまり、メイン パネルの UI が常に遅延して遅くなるということです。他には何も影響を受けません。VideoObject に対するすべての操作は期待どおりに機能し、実行速度が遅くなったり遅延したりすることはありません。

フォームのコンストラクターで VideoObject に「触れない」と、UI は完全に機能します。その後、VideoObject のメソッドを呼び出しても、UI の実行が遅くなることはありません。

すべては、メイン フォームのコンストラクターで VideoObject にアクセスするかどうかにかかっているようです。

4

1 に答える 1

1

Video オブジェクトのメソッドを呼び出すたびに、ビデオ オブジェクトとの対話に使用しているスレッドを一時的にブロックするオーバーヘッドが発生する必要があります。メソッドが呼び出されたとき、またはオブジェクトがインスタンス化されたときに、Video コンポーネントが大きなオブジェクトをメモリにロードする必要がある場合があります。

ビデオ オブジェクトのメソッドへの非同期呼び出しを試みましたか? ビデオオブジェクトが何をしていても、ビデオオブジェクトが戻るのを待っている間、効果的にブロックされません。

ビデオ コンポーネントの詳細を知らなければ、推測するのは困難です。

考えられることの 1 つは、ビデオ オブジェクトを WCF サービスでラップし、それを独自のプロセスでホストしてから、NetTcpBinding を使用してコンポーネントと対話することです。

http://msdn.microsoft.com/en-us/library/bb332338.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx

于 2013-03-08T10:14:09.123 に答える