Event in eigenem Thread starten?
-
Hallo zusammen,
ich bin mit Multithreading ein wenig vertraut und habe jetzt folgendes Problem:
Von einer Firewire-Kamera wird ein Event OnFrameReady ausgelöst, wenn bei asynchroner Bildaufnahme ein Frame bereit liegt. Durch dieses Event sollen nun bei jedem Frame (200/s) eine Funktion zur Bildverarbeitung aufgerufen werden. Nun friert leider meine komplette Anwendung ein, während dies geschieht. Ich habe schon etwas rumgesucht, finde aber vertrauenserweckende Möglichkeit, da die aufzurufende Funktion mindestens einen Übergabeparameter (Bitmap) erwartet.
Ich habe mir mal folgende Hilfsfunktion geschrieben, weiß aber nicht ob sie wirklich Sinn macht - stabil läuft das Ganze so auf jeden Fall leider nicht...
private void ParameterizedThreadStartStop(ref Thread myThread, String Action, object myParameter) { Monitor.Enter(this); //Sperre zur Verhinderung des Zugriffs durch mehrere Threads try { if (Action == "Start")//Wenn Thread gestartet werden soll { if (myThread.ThreadState == (ThreadState.Background | ThreadState.Unstarted))//Wenn Thread noch nicht gestartet wurde myThread.Start(myParameter); //Thread starten else if (myThread.ThreadState == ThreadState.Stopped) //Wenn Thread bereits einmal gestartet und wieder beendet wurde { if (myThread == WriteToADSThread)//Abfrage um welchen Thread es sich handelt myThread = new Thread(new ParameterizedThreadStart(myADSCom.MultiThreadingWritePointToADS)); //Thread neu initialisieren else if (myThread == ImageProcessingThread)//Abfrage um welchen Thread es sich handelt myThread = new Thread(new ParameterizedThreadStart(ImageProcessing)); //Thread neu initialisieren myThread.IsBackground = true;//Thread als Hintergrundthread definieren myThread.Start(myParameter); //Thread starten } } else if (Action == "Abort")//Wenn Thread abgebrochen werden soll (Rudimentär, wird in der aktuellen Version nicht benötigt) { if ((myThread.ThreadState != (ThreadState.Background | ThreadState.Stopped)) && (myThread.ThreadState != (ThreadState.Background | ThreadState.Unstarted))) myThread.Abort(); } } catch { MessageBox.Show("Fehler beim Starten oder Beenden eines Threads!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); } Monitor.Exit(this); //Freigabe des Programmteils für andere Threads }
Es wäre sehr schön, wenn jemand einen Beispielcode oder einen Tipp für mich hat, wie ich das mit
myCamera.OnFrameReady += new UniCamera.FrameReadyHandler(OnFrameReady);
erstellte Event
void OnFrameReady() {...}
in einem eigenen Thread laufen lassen kann.
Vielen Dank für Eure Mühe!
-
Klassischer Fall für eine Producer-Consumer Queue?
-
hustbaer schrieb:
Klassischer Fall für eine Producer-Consumer Queue?
Leider macht mich auch Google nicht wirklich schlau was das ist....
-
Ok, nach einiger Suche hab ich ein paar Beispiele gefunden, weiß aber nicht wirklich ob und wie mir das weiterhilft... Könntest Du mir vielleicht noch einen Denkanstoß geben hustbaer?
Vielen Dank!