構造的な問題があり、結果としてSystem.ObjectDisposedException
がdllになります。スレッドDLL呼び出しを使用している間にアプリケーションを終了します
具体的には、カメラからデータをキャプチャすることをお勧めするμEyeCameraドライバです。後者は私のキャプチャが完了しbeeingてて、私は私の画像を保存して続けることができると言われます
- OnFrameEvent
- OnSequenceEvent:私は非同期的に解雇され、このカメラからの二つの事象を得ました。
:あなたはthis?.Invoke((MethodInvoker)delegate() { pbOverallProgress.Value++; pbCapture.Value++; });
Invoke
呼び出しは "キャンセル" -Buttonが押されているようbeeingてObjectDisposedException
の原因になります期待し得るような - しかしprivate void onSequenceEvent(object sender, EventArgs e) { uEye.Camera Camera = sender as uEye.Camera; SequenceCount++; Camera.Acquisition.Stop(); int s32SeqID; statusRet = Camera.Memory.Sequence.GetLast(out s32SeqID); Invoke((MethodInvoker)delegate() { lblStatus.Text = "Save Images..."; this.pbCapture.Value = 0; }); Rectangle src = new Rectangle(); Rectangle dst = new Rectangle(); src.X = AOI_Size.X; src.Y = AOI_Size.Y; src.Width = AOI_Size.Width; src.Height = AOI_Size.Height; dst.X = 0; dst.Y = 0; dst.Width = AOI_Size.Width; dst.Height = AOI_Size.Height; Bitmap bitmap_source = new Bitmap(MySensorInfo.MaxSize.Width, MySensorInfo.MaxSize.Height);; Bitmap bitmap_destination = new Bitmap(dst.Width, dst.Height);; Graphics g = Graphics.FromImage(bitmap_destination); for (int i = 1; i < s32SeqID; i++) { Camera.Memory.ToBitmap(i, out bitmap_source); g.DrawImage(bitmap_source, dst, src, GraphicsUnit.Pixel); bitmap_destination.Save(PathToSave + i.ToString() + ".bmp"); this?.Invoke((MethodInvoker)delegate() { pbOverallProgress.Value++; pbCapture.Value++; }); } bitmap_source.Dispose(); g.Dispose(); this.CloseForm?.Invoke(1); }
:
この
は、作業を行うコードでありますキャンセルボタンのコードは次のとおりです。
private void btn_Exit_Click(object sender, EventArgs e) { if (MessageBox.Show("Do you really want to cancel?", "Abort", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { this.CloseForm?.Invoke(0); } } private void UEye_Dialog_Form_CloseForm(int exitCode) { this?.Invoke((MethodInvoker)delegate() { if (Camera != null) { Camera.EventFrame -= onFrameEvent; Camera.EventSequence -= onSequenceEvent; } Camera?.Acquisition.Stop(); Camera = null; ReturnCode = exitCode; this.Close(); }); }
UEye_Dialog_Form_CloseForm(int exitCode)
はイベントで、CloseForm
が代理人です。私は、これはあまりにも多くの情報ではなかった願っています:)
この例外私が撮影するシーケンスを待っている場合、画像は、保存されませんbeeingている場合にのみoccure。
確かに、UI更新コードをtry-catchブロック内にパックするか、フォームの状態がDisposed/Disposingであるかどうかを確認できます。しかし、私の小さなプログラミングスキルのためには、構造的な問題のように見えます。
はあなたの助けをありがとう:)
こんにちはLuaan、あなたの答えに感謝します。実際には 'btn_Exit_Click'のほかに、私が使用しているDLLによって作成された別のスレッドでコードが実行されます。 – AllDayPiano
@AllDayPianoちょうどポイントである 'Invoke'd部分を除いて。 'Invoke'を行う前にウィンドウがスレッドセーフな方法で存在していることを確認する必要があります。これはあなたが現在行っているスレッドとUIスレッドとの同期が必要です。 – Luaan
Ahhhh ok。私はそれについて考えるとかなり明確です!私は、これをどのように解決するかについての良いインプットがあるかもしれないと思います。しかし、あなたの助けに感謝します。これは素晴らしいヒントです! – AllDayPiano