Ich arbeite gerade mit AForge und habe ein neues Frame-Event, das den Frame als Bitmap in eine Picturebox stellt. In 90% der Fälle funktioniert es großartig ... WENN ich mit etwas an der Winform herumspiele. Wenn Sie ein Kombinationsfeld ändern, das Fenster verschieben oder ähnliches, besteht die Gefahr, dass die Picturebox vom Video auf ein großes rotes X-Code-Beispiel umschaltet:
%Vor%Ich habe eine Pause auf dem if (videoPictureBox1.Image == videoPictureBox1.ErrorImage) gesetzt und es wird falsch ausgewertet, auch wenn das große rote X oben ist, weil das Bild tatsächlich auf die Bitmap gesetzt wird. Also cam.Stop () und cam.Start () laufen nie (nicht sicher, ob das überhaupt helfen würde, aber ich dachte, ich würde es versuchen).
videoPictureBox1.Refresh () wird jedes Mal ausgeführt, aber es macht keinen Unterschied. Habe immer noch das große rote X.
Wie ich schon sagte: Wenn ich das Video starte und nichts anfasse, wird das große rote X niemals passieren. Aber in dem Moment, in dem ich anfange, die Kombinationsfelder zu wechseln oder das Formular selbst zu ziehen, steigt die Wahrscheinlichkeit des großen roten X exponentiell an. Manchmal kann ich das Kombinationsfeld 10-12 mal durchblättern, bevor es passiert, manchmal passiert es das zweite Mal, dass ich auf die Combobox klicke. : - \
Kann jemand erklären, was hier vor sich geht und vielleicht einen Vorschlag für die beste Methode machen, um das Problem zu beheben? Ich bin immer noch sehr neu im Threading, also habe ich mich angestrengt, genau den Überblick zu behalten, was hier passiert und wie ich das Problem am besten lösen kann! Jede Bewegung in die richtige Richtung wäre eine große Hilfe!
Shawn Hargreaves hat eine ausgezeichnete, prägnante write-up vom" großen roten X des Schicksals ". Ich fand es sehr hilfreich im allgemeinen Fall, wenn WinForm-Komponenten plötzlich das rote "X" zeigen.
Zusammenfassend:
OnPaint
-Ereignis auslöst. OnPaint.
Um es zusammenzufassen: Dies ist ein getestetes Minimum, das für mich kein rotes Kreuz zeigt, selbst wenn die Größe geändert, gestartet, gestoppt oder die Auflösung geändert wurde.
%Vor%Bitte beachten Sie, dass wir videoSource.Start () aufrufen; aus dem GUI- (creation) -Thread, aber der Call-Back-Handler (Handle_Very_New_Frame) wird vom Video-Thread (workers) aufgerufen.
Ich denke, deshalb brauchen wir sowohl das Invoke als auch das neue Bitmap, also wird das neue bmp auch aus dem GUI-Thread generiert. Aber ich rate nur hier, weil ich keinen Beweis finden konnte.
Tags und Links c# winforms thread-safety aforge picturebox