Ich schreibe ein Webbrowser-Plugin (NPAPI.)
Mein Plugin startet einen Arbeitsthread, und während der Arbeitsprozess fortschreitet, möchte ich Ereignisse an Javascript zurückgeben. Aufgrund des NPAPI-Threadingmodells ist es jedoch nicht zulässig, dass der Arbeitsthread direkt in NPAPI zurückruft, sodass der Arbeitsthread JavaScript nicht aufrufen kann.
Eine Lösung hierfür ist die Funktion NPN_PluginThreadAsyncCall. Aber das ist eine relativ neue Funktion. Zum Beispiel wird es nur von Firefox 3 an unterstützt.
Gibt es eine Möglichkeit, asynchrone Ereignislieferung / Javascript-Ausführung von einem NPAPI-Plugin zu erhalten, ohne NPN_PluginThreadAsyncCall zu verwenden? Was haben Personen gemacht, bevor diese Funktion hinzugefügt wurde?
Die Antwort lautet ja ... und nein ...
Wenn Sie ältere Browser unterstützen müssen (vor Firefox 3), können Sie die Funktion NPN_PluginThreadAsyncCall selbst implementieren. In Windows können Sie das tun, indem Sie eine Datenstruktur erstellen, die den Funktionszeiger und den void * opaque-Zeiger enthalten kann, und dann eine benutzerdefinierte Nachricht mit einem Zeiger auf Ihre Datenstruktur als LPARAM an das Hauptfenster senden.
Das Hauptfenster WINPPROC wird auf dem UI-Thread ausgeführt, der der Thread ist, der mit Javascript kommunizieren kann. Wenn Sie diese Nachricht in Ihrem WINPROC erhalten, müssen Sie die LPARAM einfach zurück auf den Zeiger werfen, die Methode mit den undurchsichtigen Daten aufrufen und dann die Datenstruktur freigeben.
Unter Mac können Sie eine ähnliche Funktion mit einer Warteschlange ausführen, in der die Ereignisse gespeichert werden, und dann mit dem NULL-Ereignis (das von Mac OS bei jedem Tick gesendet wird) prüfen, ob etwas darin enthalten ist. Wenn das der Fall ist, machen Sie es los, rufen Sie die Methode auf, geben Sie sie frei und machen Sie weiter.
Es gibt wahrscheinlich einen Weg, es auch unter Linux zu tun, aber ich weiß nicht, was es ist.
Sie finden ein Beispiel für die Windows-Version im Feueratemprojekt .
Die Behandlung der winproc Nachricht ist in dieser Datei: Ссылка
Die Ereignis- und Datenstruktur ist in ihrer Header-Datei definiert: Ссылка
Und die Methode zum Auslösen dieses Ereignisses ist hier:
%Vor%Tags und Links javascript plugins browser npapi