**重複の可能性について - BackgroundWorker メソッドはここでは適用されません。
以下は、AForge ライブラリを使用して IP カメラからビデオを受信する試みです。
各ビデオ ストリームは個別のスレッドで実行され、新しいフレームが到着したときに UI スレッドに通知することになっています。イベント ハンドラーは、それを発生させた同じスレッドで実行されるため、Invoke を使用する必要があります。
アプリケーションを停止するまで、すべてがスムーズに実行されます。「>>>」でマークされた行は ObjectDisposed 例外をスローするため、アプリケーションは実行中にスムーズに終了しません。
問題はマルチスレッドの理解にあることは知っていますが、それが原因で実際の問題がわかりません。誰かがここで何が起こっているのか説明してもらえますか?
Form1.cs
public void generic_NewFrame(object sender, NewFrameEventArgs e)
{
...
if (pictureBox1.InvokeRequired)
{
>>> pictureBox1.Invoke(new MethodInvoker(delegate()
{
pictureBox1.BackgroundImage = (Image)buf;
}));
}
else
{
pictureBox1.BackgroundImage = (Image)buf;
}
...
}
できるだけ短く、 Camera クラス:
Camera.cs
//Camera thread loop
private void WorkerThread()
{
while (!stopEvent.WaitOne(0, false))
{
...
if (!stopEvent.WaitOne(0, false))
{
// notify UI thread
OnNewFrame(new NewFrameEventArgs(Last_frame));
...
}
}
override public void Play()
{
stopEvent = new ManualResetEvent(false);
thread = new Thread(new ThreadStart(WorkerThread));
thread.Start();
}
override public void Stop()
{
if (thread != null)
{
stopEvent.Set();
}
}