VideoObject
C++ 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 にアクセスするかどうかにかかっているようです。