Thread Perl Funktion von XS aufrufen (16 answers)
Opened by Max_Perlbeginner at 2019-01-02 16:28

murphy
 2019-01-14 13:23
#189449 #189449
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
2019-01-13T18:32:10 Max_Perlbeginner
[...]
Allerdings ist es erforderlich, MPV in einer Event Schleife auszuführen. Problematisch ist dies v.a., wenn man libmpv zusammen mit einer GUI einsetzen will, die ja ein eigene Ereignisschleife hat. Hierfür ist in der C Bibliothek die Funktion set_wakeup_callback da. Dieser kann man eine Funktion übergeben, die aufgerufen wird, wenn ein neues Ereignis eingetreten ist. Allerdings geschieht dies aus einem zufälligen C-Thread.
[...]

Ich habe zwar keine Erfahrung mit der spezifischen hier verwendeten Kombination von Bibliotheken, aber generell ist es eine schlechte Idee aus mehreren Threads auf ein UI-Toolkit zuzugreifen. Praktisch jedes UI-Toolkit erwartet, dass sämtliche Aufrufe in genau einem nativen Thread stattfinden und einige Toolkits erfordern auch noch, dass es der primordiale Thread sein muss. Die einzigen Ausnahmen die mir dazu einfallen sind AWT (Java) und native Win32-API-Aufrufe.

Wenn MPV also irgendwelche Ereigniscallbacks aus zufälligen Threads aufruft, dann solltest Du auf keinen Fall direkt in dem Callback auf die UI-Bibliothek zugreifen. Stattdessen musst Du wohl oder übel das Ereignis von MPV irgendwie verpacken, in eine Warteschlange legen und innerhalb der Tcl/Tk Ereignisschleife auswerten.

Außerdem kann es auch sein, dass Aufrufe in den Perlinterpreter von verschiedenen Threads aus ein Problem darstellen. Perl ist alt und hat keine volle Unterstützung für native Threads. Ich bin mir zwar nicht sicher, würde aber erwarten, dass Du innerhalb des Callbacks von MPV aus weder Perl- noch Tcl/Tk-Funktionen sicher aufrufen kannst!

Vermutlich wäre die korrekte Lösung also das Callback für MPV in C zu schreiben, Ereignisse von dort in eine Warteschlange zu legen und für Tcl/Tk in C eine neue Ereignisquelle zu bauen, die diese Warteschlange abfragt und dann im Tcl/Tk-Ereignisthread ein Perl-Callback aufruft.
When C++ is your hammer, every problem looks like your thumb.

View full thread Perl Funktion von XS aufrufen