messagepump unter DreamOS

  • Hi zusammen,
    beim Modifizieren eines Plugins habe ich ein Problem mit der messagepump unter OE2.2, bei dem ich nicht weiterkomme. Unter OE2.0 funktioniert alles wie es soll, ich habe auch mit mehreren anderen OE2.2-Plugins verglichen und finde keine Unterschiede. Wie üblich, wirds nur eine Kleinigkeit sein, aber ich finde es einfach nicht.


    Ein Unter-Thread, der umfangreiche Datenbank-Aktionen durchführt, soll den Fortschritt an den Hauptthred senden, der diesen Fortschritt auf dem Bildschirm anzeigt. Ausserdem soll der Hauptthread einen Abbruch-Befehl an den Unter-Thread senden.


    Es gibt keinen Absturz, aber das Übergeben der Informationen über push und pop funktioniert unter OE2.2 einfach nicht. Ich habe diverse Logs eingebaut; der Unterthread wird ausgeführt, die push() und send() - Befehle werden auch ausgeführt, aber auf der jeweils anderen Seite kommt einfach nichts an. Wie erwähnt, unter OE2.0 funktionierts.


    Ich könnte zur Not alles in den Hauptthread verschieben, aber das wäre nur ein "dirty" - Workaround - das muss doch eigentlich auch "richtig" zu lösen sein. Erschwerend kommt dazu, dass ich selbst keine OE2.2-Box habe und mit jedem neuen Versuch auf die Rückmeldung von Testern und meine Logs angewiesen bin, was natürlich sehr mühsam und zeitaufwändig ist.


    Vielleicht kann mir jemand einen Tip geben?


    Ich hänge mal den relevanten Auszug aus dem Plugin an, ausserdem das komplette Plugin sowohl als ipk als auch als deb (ist das gleiche Programm) für jemanden, der es vielleicht komplett testen will.


    Edit: Zusatzinfo (hatte ich vergessen zu erwähnen): Auch Abfragen der Properties (z.B. databaseActions.isRunning) funktionieren nicht unter OE2.2


    Danke
    Alfred

  • Im DreamOS sind unterschiedliche Threads sauber getrennt, das ist nicht so wie früher wo du alles quer Beet machen konntest.


    Du kannst zwar dem DreamOS mit divesen @classmethod (fast) wieder das alte Verhalten aufzwingen, aber das ist nicht der Sinn der Sache.


    Ich weis das hilft dir nicht wirklich und bringt mich manchmal auch an den Rand der Verzweiflung, weil mir das unsaubere lieb und vertraut ist und meinem Programmierstil mehr entspricht, aber die Zeit die schreitet halt fort und wir schreiten mit (c) Wilhelm Busch

    Einmal editiert, zuletzt von Lost in Translation ()

  • @gutemine
    Danke dir für die Antwort; hatte insgeheim darauf gehofft, auch von dir einen Tip zu erhalten, wollte dich aber nicht schon wieder per PM belästigen.. :face_with_rolling_eyes:
    Heisst das, dieses messagepump-Konstrukt funktioniert in OE2.2 nicht mehr? Ist dann das Sinnvollste / Sauberste, die Funktion in meinem Fall tatsächlich in den Hauptthread zu integrieren? Oder gibts noch eine andere Vorgehensweise, die ein Anfänger wie ich auch versteht (bzw. irgendwo nachlesen kann)?


    Wie schon gesagt, ich hab da eigentlich kein Problem damit, alles in den Hauptthread zu übernehmen. Mich wunderts eben nur, dass ich beim Suchen genau dasselbe in anderen Plugins (z.B. SeriesPlugin) gefunden habe. Hab allerdings nicht getestet, obs da funktioniert, da ich das Plugin nicht verwende.
    Grüsse Alfred

  • Auch das CrossEPG hat ein ähnliches selbe Design Problem, weswgen ich dann mein eigenes OpenEPG gemacht habe.


    Wobei du vielleicht zu kompliziert denkst, die klassichen Timer oder Container Threads waren im alten E2 nie 100% threadsicher, wesqwegen dann eben so komische Konstrukte gewählt wurden, damit es nicht hängen bleibt oder ständige Sandräder produziert.


    Eigentlich ist das aber nicht mehr nötig. Ich war beim Coden vom OpenEPG sogar positiv überrascht was für heavy tasks (inklusive Befüllen und Laden der epg.db) man damit im Hintergrund machen konnte, OHNE auch nur Sandräder zu kriegen.


    Dort siehst du auch wie man das @classmethod missbrauchen kann :face_with_rolling_eyes:


    Und Standard E2 hat ja auch Beispiele wie man Sachen im Hintergrund mit Fortschrittsanzeige machen kann und soll - Kanalscan, Softwareupdate,...


    Meine "Lösungen" sind nämlich nicht best in class :thumbs_up:


    Nachdem aber verdächtig oft nur mehr von mir Antworten kommen, habe ich halt oft das Meinungsmonpol - oder muss Wiederspruch provizieren - was mir bitte verziehen sei.

    6 Mal editiert, zuletzt von Lost in Translation ()

    • Offizieller Beitrag

    Um die ursprüngliche Frage zu beantworten. Die connections in OE 2.2 bestehen nur solange wie das jeweilige connection object lebt. Also in deinem Fall einfach self.databaseActions_conn=databaseActions.MessagePump.recv_msg.connect(self.gotThreadMsg) ansonsten wird ja das connectionObject am funktionsende wieder zerstört.


    cu

  • Hi gutemine, danke dir nochmal.
    Hab mal über dein OpenEPG drübergeschaut; ich muss gestehen, dass ich (noch) nicht so ganz kapiert habe, was du da machst.... Muss ich mir wohl noch genauer anschauen.


    Was mich halt immer noch wundert, ist, dass in diversen anderen Plugins das messagepump-Konstrukt nach wie vor so im Einsatz ist, und dass ich da absolut keine Unterschiede zu meinem Code sehe. Ich gehe mal nicht davon aus, dass die alle nicht funktionieren. Und, wie gesagt, die zusätzliche Problematik ist, dass ich keine DreamOS-Box zum Testen hab. Vielleicht findet ja mal noch einer, der dieselbe Methode im DreamOS nutzt, Zeit und Lust, sich das anschauen. Und erkennt dann womöglich meinen Fehler sofort ...


    Grüsse Alfred


    Edit: Ghost: Da hatten wir grade gleichzeitig geschrieben. Jetzt, wo du das schreibst: Verdammt, das hatte ich doch schonmal gelesen...
    Wenns wirklich so einfach ist, wärs ja klasse.
    Damit ichs richtig verstehe: Es reicht, aus dem databaseActions_conn ein self.databaseActions_conn zu machen, damit es eben erhalten bleibt.
    Ich muss es nicht in jeder Funktion der Klasse erneut definieren.
    Auf jeden Fall auch dir Danke...

  • Hi,
    die Rückmeldung hat etwas gedauert, da ich ja erst aufs Testen der Boxen-Nutzer warten musste.
    Nochmal danke an alle, das bisschen "self." beim _conn -Objekt wars tatsächlich. Vielleicht merke ich mir das jetzt mal... :loudly_crying_face:
    Grüsse Alfred