enigma2-log hilft mir nicht weiter, vermutlich Threading-Problem

  • ob das jetzt alles vom relevanten Code ist, sei mal dahin gestellt.
    Ich nehme mal an, du benutzt wirklich keine eTimer im Thread (.start o.ä.) . Ich habe allerdings auch die Erfahrung machen müssen, das solche FATAL!: addTimer Meldungen kommen, obwohl ich ganz sicher selber keinerlei Timer im Thread nutze. Auch nutze ich keine e2-Funktionen und genau das solltest du z.B. auch unterlassen. Es dürfen KEINE e2-Funktionen innerhalb eines Threads benutzt werden. Alles was mit from e..... import .... zu tun hat ist im Thread Tabu.
    Ghost hat diese Meldung extra eingebaut, damit darauf hingewiesen wird. Die Wahrscheinlichkeit das irgendwo ein Crash entsteht (bei dieser Meldung) ist relativ hoch. Leider hilft die Meldung nicht wirklich die eigentliche Ursache zu zeigen, nur das sein eigenes Plugin irgendwie damit zusammenhängt. Leider bin ich nicht sehr hilfreich, ich weis :winking_face: ....

  • Zitat

    ob das jetzt alles vom relevanten Code ist, sei mal dahin gestellt.


    "im Thread eingebaut" betrifft nur den Thread oder auch das ausgelöste Handler? oder das was dann danach kommt?


    alles was den Thread beschreibt habe ich gepostet, da habe ich nix weggelassen - doch, in autostart schreibe ich noch log mit open und write


    im Thread selbst ist ja nichts derartiges (und nein, eTimer habe ich auch keine eigenen drin)


    Zitat

    Leider bin ich nicht sehr hilfreich, ich weis

    na du versuchst schon mal mir weiterzuhelfen, das ist doch was - evtl bringen ja meine Antworten auf deine Nachfragen jemand anderen dazu, mir den "du musst doch nur..." - Hinweis zu geben :smiling_face:


    ich könnte auch den ganze code geben falls es möglicherweise hilft, aber ich kann und darf ihn derzeit nicht veröffentlichen

  • da der ganze "Server" im Thread läuft, werden auch die Ereignisse/handle dort abgearbeitet (denke ich). Vielleicht solltest du die e2-Dinge aus dem Thread entfernen und irgendwie (Message-Queue oder was weis ich) an den E2-Main zurückgeben und dann dort ausführen.

  • ups, nu guck ich wie Schwein ins Uhrwerk :confused_face:


    habe mal nach ePythonMessagePump gesucht aber die paar dinge haben mich nicht erleuchtet


    im Handler wird ja eine Screen-Klasse aufgerufen, die funktioniert allein für sich problemlos - hat jedoch natürlich viele e2-Dinge drin
    wenn das zum Thread gehört dann geht ja gar nichts mehr?


    oder geht es nur um den Handler und danch "ist wieder alles gut" ?


    also eine zusätzliche Klasse schaffen, welche der Handler aufruft und von dort alles ausführen?
    und was/wie/wo mach ich mit ePythonMessagePump?

  • schau mal hier auf Schwerkraft. Schaut übersichtlich aus, ist auch ein Thread mit einem .send() und deren Abarbeitung. Aber Ahnung habe ich davon auch nicht, ist aber kurz und wenn man sich die "pump" Dinge anschaut, kann man das sogar verstehen :smiling_face:
    https://schwerkraft.elitedvb.n…totimer/src/AutoPoller.py


    PS: das Beispiel ist aber für OE2.2 wegen der .connect-Syntax. Das ist im <oe2.2 anders..... aber so 100% verstehe ich den Code doch nicht :winking_face:


    OE<2.2 Entsprechung : https://schwerkraft.elitedvb.n…ef970a1;hb=refs/heads/4.0


    Edit: "er" benutzt eine Queue für die Übergabe von Werten, wie ich sehe.

    2 Mal editiert, zuletzt von joergm6 ()

  • Die Grundidee ist simpel: der Thread schreibt in eine Queue und über ePythonMessagePump() methoden wird die Queue in e2 wieder ausgelesen. So ist innerhalb deiner Thread Klasse als einzige e2 Klasse nur ePythonMessagePump() vorhanden.

  • ich steige nichtmal annähernd dahinter was ich tun muss


    es ist ja kein gewöhnliches Thread-Prozedere, sondern z.B. SocketServer.ThreadingTCPServer


    zudem benötige ich (besser weiß ichs nicht) ja statt der dort zu sehenden 2 Blöcke bei meiner Geschichte 4:
    autostart
    serverstart
    MyThreadingServer
    HLHandler


    habe echt keinen Plan, wie ich da wo eingreifen soll :confused_face:


    muss dazuschreiben, das Threading selbst habe ich wohl eh noch nicht kapiert, aber bisher mit Try and Error immer zum Ziel gefunden
    mangels 7020/7080 kann ich jedoch nicht "rumprobieren"


    edit.
    ich nehm jetzt mal aus Handler alles raus was irgend möglich ist, session.open dürfte ja kein problem machen was dann in der Klasse kommt

  • ich würde erst einmal die pump definieren
    self.__pump = ePythonMessagePump()
    self.__pump.recv_msg.get().append(self.gotThreadMsg)


    und in gotThreadMsg mal ein print "toll es geht" definieren.
    und aus dem Thread ein
    pump = self.__pump
    pump.send(0)


    das self.__pump muss irgendetwas sein, was in der gotThreadMsg und im Thread verfügbar ist. Im Beispiel wird ja der Thread innerhalb der Klasse gestartet und somit ist self "bekannt". Später noch die Queue für Werteübergabe ist dann nicht das Problem. Die "__" würde ich nicht nutzen, weil ich das nie nutze *renn* bedeutet ja, das man diese __ nur innerhalb der Klasse "rufen" kann
    /me sich das so denkt.....

  • joergm6
    ich probier da mal, das dumme ist auf den Boxen die ich habe läuft es ja bisher ohne Probleme, nur auf den genannten eben nicht - also sehe ich leider nicht ob/wie es sich auswirkt


    Bobo71
    wie ich oben schon schrieb kann/darf ich derzeit dazu nichts veröffentlichen
    es ist ein tcp-server welcher auf dem Port lauscht und dann das eigentliche komplexe Plugin startet

  • Hallo Shadowrider,


    unter Twisted kannst du ziemlich unkompliziert einen TCP Server aufsetzen. Und er ist asynchron. Kannst es dir ja mal anschauen.
    Hier


    Deinen Fehler mit Fatal... Hatte ich Anfang des Jahres auch. Der Bug sollte im OE 2.2 gefixt sein. Ist das Enigma2 deiner Testbox aktuell?


    Vom Handy...

    Die meisten Probleme macht man sich selber!

  • mein Server läuft absolut zuverlässig so wie gewünscht - leider offenbar nicht auf den OE 2.2 Boxen
    (schau mir das andere aber gern auch an)


    ich selbst habe leider keine entsprechende Box zum Testen, ich sende das Programm einem Laien, welcher dann bemüht ist mir hilfreiche Rückmeldungen zu geben
    dort ist zwar gestern das Image vom 04.12.2014 geflasht worden und die Aktualisierungen durchgeführt, jedoch gibt es nun (ohne jegliche sonstige sytemveränderung) massive weitere Probleme mit irgendwelchen fehlenden png's lt. e2-Log
    (sag ja, solange ich die Box vor Ort habe und flashen, einstellen und auch testen kann konnte ich Probleme bisher immer lösen, so ist das extrem kompliziert bis unmöglich)


    edit: fängt schon damit an, dass das per telnet installierte Plugin zwar in den Erweiterungen erscheint und läuft, lt. Tester aber nicht deinstallierbar ist per menü
    habe auch noch nicht herausgefunden, wie ein externes Plugin auf dem Original-Image ohne telnet installierbar wäre (webadmin beim Tester wohl installiert aber nicht im Browser abrufbar)

    • Offizieller Beitrag

    Also... Ich bin Grad nicht zu Hause werde aber spätestens Morgen noch mehr dazu schreiben. Das Problem ist, dass es auf egal welchem Stand von enigma2 schon Immer tödlich war core Funktionen einfach aus einem anderen Thread zu rufen. Der Core ist nicht Thread safe. Und da so etwas i.d.R für absolut unerklärliche abstürze sorgt, haben wir dann irgendwann diesen relativ harten Check eingebaut. Das Image deines Testers ist übrigens hoffnungslos veraltet, er sollte unbedingt mal ein Update machen.
    Ich werde dir Morgen ein paar Beispiele Posten wie man Dinge korrekt in einem Thread abarbeiten kann.

  • alsi eigentlich ist nichts mehr in den threads was stören könnte
    auch das dialog-schließen ist raus und selbstverständich lösche ich den mit session.deleteDialog(melde_screen)


  • so, image beim Tester aktualisiert per Webinterface
    aus meinen Threads eigentlich alles ausgelagert, gleiches problem
    Reichi: bin wohl aufgeschmissen wenn du mir nicht das Brett vom Kopf tust :grinning_squinting_face:
    (kann dir auch gerne das Plugin per PN senden wenn es hilft)


    • Offizieller Beitrag

    Jetzt mal rein davon ausgehend wie ich das im Logfile verstehe ist das Problem recht klar.


    Du öffnest den neuen Dialog in "pack_ok", aber alles was in "handle" passiert ist in einem eigenen Thread.
    Wenn du also eine deiner Methoden aus "handle" heraus rufst bist du immer noch im request-thread, nicht im Main-Thread!
    In deinem Fall rufst du also session.open und genau das darfst du auf keinen Fall.


    Das Problem mit dem Threading lässt aber mit HIlfe von ein paar twisted (in dem Fall genau einem) Helfern super simpel lösen z.B. so:



    Die "v_info / webserver global" würde ich möglichst entfernen und auch über pack_ok mitschicken.