Hoffe ich bin hier richtig.
Hab ein Problem mit einem Threadübergreifenden Zugriffe auf die Eigenschaft label.visible.
Ich verwende Aforge.net für die Wiedergabe einer mpg.datei. Über den newFrame-Event wird bei jedem neuen Bild das der videosourceplayer erhällt eine Algorithmus zur Bildbearbeitung ausgefürt.
Dieser Liefert einen Wert der je nach Höhe ein Label visible= true bzw. false setzt.
Da der direkte Zugriffe auf die Steuerelemente zu einer Exception führt. Habe ich mir ein paar Codeschnippseln zusammengesucht und das über delegaten geregelt.
Hier der Code:
New-Frame-Event von dem aus die Änderung des Steuerelements aufgerufen wird
private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
{
...........Algorithmus der count festlegt.......
if ((count ≥ DetectionValue) && (TrainDetected == false))
{
TrainDetected = true;
Zugdetektion(true);
}
if ((count < DetectionValue) && (TrainDetected == true))
{
TrainDetected = false;
Zugdetektion(false);
}
// Edit: Ohne diesen zweiten Aufruf schein alles zu funktionieren
WriteTextBox("Frames: " + Count);
}
Änderung des Steuerelements:
delegate void ZugdetektionDelegate(bool detected);
private void Zugdetektion(bool detected)
{
if (label5.InvokeRequired)
{
label5.Invoke(new ZugdetektionDelegate(this.Zugdetektion), new object[] { detected });
}
else
{
if (detected)
label5.Visible = true;
else
label5.Visible = false;
}
}
Zweite Änderung eines Steuerelements:
delegate void WriteTextBoxDelegate(string text);
private void WriteTextBox(string text)
{
if (label3.InvokeRequired)
{
label3.Invoke(new WriteTextBoxDelegate(this.WriteTextBox), new object[] { text });
}
else
{
label3.Text = text;
}
}
Dabei kommt es zu folgendem Fehler:
Das Video und die gesamte Form friert ein und beim Versuch mit Pause im Debugger in den derzeitigen ausgeführten Code zu gelangen wird immer Application.Run(new Form1());
angezeigt. Breakpoints im Programmcode haben ebenfalls zu keinem Aufruf geführt sobald die Form eingefrohren ist.
Der Fehler passert immer exact nach der selben Anzahl von erhaltenen Frames. Geht man den Code ab dieser Zahl händisch mit Breakpoints durch kommt es zu keiner Fehlermeldeung und der Code wird normal ausgeführt. Sobald man das Programm dann allerdings wieder laufen lässt friert wieder alles ein.
Edit: Also scheint so als ob die zwei Aufrufe auf die labels sich gegenseitig irgendwie stören und den freeze auslösen. Wenn nur eins von beiden verwendet wird funktionierts einwandfrei.
Wäre nett wenn wer einen Rat hätte was hier falsch rennt.
Danke und lg
dodoflash