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!


Anmelden zum Antworten