Frage zur Thread-Programmierung mit VDR

  • Hallo,


    habe eine Frage zur cThread-Klasse von VDR:


    Also, ich erzeuge mit

    Code
    myThread thread=new myThread()

    eine Instanz einer Klasse, die von cThread abgeleitet.

    Code
    thread->Start();

    sorgt dann ja dafür, dass der Thread gestartet wird, indem die Methode Action() ausgeführt wird. Wenn ich mit dem, was dort getan wird, dann fertig bin, Action() also beendet wird, beendet sich dann auch der Thread? Wenn ja, was passiert mit meiner Variable thread? Kann ich mit einer Abfrage der Form

    Code
    if(!thread)
    {
      ...

    feststellen, ob schon ein Thread existiert? Ich sehe da irgendwie nicht so richtig durch :rolleyes:


    Wäre schön, wenn mir da jemand auf die Sprünge helfen könnte.


    Gruß
    Nordlicht

  • Hi,


    ich mach das immer mit einer m_instance static-Variable im thread. Hier aus dem deluxe-Plugin:


    Header:


    Teile der Implementierung:


    Thread-Start und Prüfung:

    Code
    if (cConvertToAudioThread::m_Instance)
            cConvertToAudioThread::Exit();
        else
            cConvertToAudioThread::Init(recording);
        return osEnd;
    }


    Tschüss,


    winni

  • Habe eben ein interessantes Howto zur Thread Programmierung gefunden.


    Vieleicht hilft es anderen wenn sie mit ihren fragen zufällig über diesen Beitrag stolpern...


    Linux-Magazin - Threads


    Gruß,
    Thomas

  • Hallo Winni,


    so geht es natürlich auch ;)


    Meine Frage kommt eigentlich daher, weil ich mir wegen dem Thema Thread-Programmierung die Klasse cCutter von VDR angeschaut habe. In dieser Klasse ist ein Zieger definiert, der auf die Instanz einer von cThread abgeleiteten Klasse zeigt. Und dort gibt es eine Abfrage der Form if(!cuttingThread), wobei ich aber nirgends die Stelle finde, wo der Zeiger wieder auf NULL gesetzt wird, wenn der Thread sich beendet hat. Vielleicht bin ich aber auch nur blind ;)


    Gruß
    Nordlicht

  • Zitat

    Originally posted by nordlicht
    Wenn ich mit dem, was dort getan wird, dann fertig bin, Action() also beendet wird, beendet sich dann auch der Thread? Wenn ja, was passiert mit meiner Variable thread?


    Der eigentliche Thread ist die statische Methode cThread::StartThread, die dann wiederum cThread::Action aufruft. Nachdem Action beendet wurde, setzt StartThread noch running und active auf false, und beendet sich dann. Damit endet auch die Lebenszeit des eigentlichen Threads.


    Das cThread-Objekt ist davon aber unabhängig, und existiert weiterhin. Es ist sogar vorgesehen, dass ein bereits wieder beendeter Thread mit Start() erneut gestartet, und somit recycelt wird.


    Das Aufräumen des cThread-Objekts ist die Aufgabe des 'Besitzers' des Threads, in der Regel sollte sich der darum kümmern, der den Thread angelegt hat. Da das Objekt nicht abgeräumt werden kann, so lange der Thread läuft, kann sich der Thread auch nicht selbst entsorgen.


    Zitat

    Kann ich mit einer Abfrage der Form if(!thread) { feststellen, ob schon ein Thread existiert?


    So garantiert nicht, da weder das Objekt noch der Thread etwas von dem thread-Zeiger weiss. Wer sollte thread auf NULL setzen, wenn nicht du selbst?


    Um den Thread zu kontrollieren, gibt es cThread::Running() (Thread hat Cancel-Anweisung bekommen, sich zu beenden) und cThread::Active() (Thread läuft derzeit).



    Noch ein Hinweis, weil es auf den ersten Blick schlau scheint, aber letztlich keine Lösung ist:
    Es bietet sich geradezu an, den Thread über den Destruktor zu beenden, dh. in ~cMyThread() nochmal Cancel() aufzurufen. Sauber ist es aber nicht, da im Thread ja noch auf das Objekt zugegriffen wird. Bei direkt abgeleiteten Thread-Objekten funktioniert das gerade noch, bei zweimaligem Ableiten (cMyThread : public cMyThreadBase, cMyThreadBase : public cThread) geht es dann aber garantiert schief, da der Destruktor u.U. schon Teile des Objekts abgebaut hat, bevor Action() beendet ist. Sicher ist man nur, wenn man sicher stellt, dass Cancel vor dem Destruktor aufgerufen wird:


    thread->Cancel();
    delete thread;



    Zitat

    Und dort gibt es eine Abfrage der Form if(!cuttingThread), wobei ich aber nirgends die Stelle finde, wo der Zeiger wieder auf NULL gesetzt wird, wenn der Thread sich beendet hat.


    Das Thread-Objekt wird in cCutter::Stop abgebaut. Stop wird wiederum aus cCutter::Active() aufgerufen, nachdem der Thread beendet wurde. cCutter::Active wiederum wird regelmässig aus der Haupuschleife von VDR in vdr.c aufgerufen, unmittelbar bevor "Editing process finished" gemeldet wird.


    Gruß,


    Udo

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!