Frage

Szenario:

Ich habe einen Distributed-Objekte-basierten IPC zwischen einer Mac-Anwendung und einem launchd-Daemon (mit Foundation Klassen geschrieben). Da ich Probleme hatte, bevor über asynchrones Messaging (zB ich ein Registerclient haben: auf das Wurzelobjekt des Servers und wenn ein Ereignis gibt es das Root-Server-Objekt benachrichtigt ruft / ein Verfahren, bei dem Proxy-Objekt des Kunden), habe ich lange Polling die, dass das bedeutete, Client „Ernten“ Listen von Ereignissen / Benachrichtigungen vom Dämon. Diese „Ernte“ wird durch einen Server-Objekt Methodenaufruf durchgeführt, die dann eine NSArray Instanz zurückgibt.

Es funktioniert ziemlich gut, bis sie für ein paar Sekunden, um den Prozess des Serverobjekts (durch launchd gestartet) markiert begonnen wird rot mit dem „(nicht reagiert)“ Tag daneben (innen Activity Monitor). Wie ich schon sagte, funktionell, es funktioniert gut, aber wir wollen nur dieses „reagiert nicht“ Etikett loszuwerden.

Wie kann ich verhindern, dass diese "nicht reagiert" Tag?

FYI, ich habe bereits launchd-basierte Prozesse vor und dies ist das erste Mal, dass ich lange Polling tat. Auch habe ich versucht, NSSocketPortNameServer-basierte Verbindungen und auch NSSocketPort-basiert sind. Sie haben dieses Problem nicht. Locking war nicht auch ein Problem ‚Coz die verwendeten Schlösser waren nur NSCondition ist und wir angemeldet und ausgetestet, das Programm und es scheint, als ob die einzige locking‚Ausgabe‘an der Ernte Teil ist, das ist eigentlich, funktionell arbeitet. Auch Client-Prozess wird geschrieben in PyObjC während Server-Prozess geschrieben wurde mit ObjC.

Vielen Dank im Voraus.

War es hilfreich?

Lösung 3

Mein Problem eines Prozesses PID mit der Unterschrift FNDR tatsächlich der Ruf war für immer ..., dass ein Teil verursacht den Fehler „nicht reagiert“, und es war nie die Schlösser oder die Lang Polling Teil. Tut mir leid, diese Jungs. Aber Gott sei Dank fand ich die Antwort schon.

Andere Tipps

Probe den Prozess zu finden sie heraus, was es tut, oder warten auf.

Peter richtig im Ansatz, wenn Sie es, um herauszufinden, möglicherweise in der Lage, durch einfache Inspektion. „Reagiert nicht“ bedeutet, dass Sie nicht Ereignisse auf dem Ereigniswarteschlange für mindestens 5 Sekunden der Verarbeitung (2 verwendeten Sekunden, aber sie upped es in 10.4). Für einen UI-Prozess würde dies eine Spinnwartecursor erstellen, aber für einen Nicht-UI-Prozess, sind Sie nicht die Effekte, wie leicht zu sehen.

Wenn dies ein Runloop-Programm ist, es bedeutet, dass Sie wahrscheinlich mit einer blockierenden (synchron) Betrieb, etwas zu tun, das mit dem Laufschleife getan werden sollte und eine Rückruf (async). Alternativ müssen Sie einen zweiten Thread Ihre Sperrung Operationen zu verarbeiten, um Ihren Mainthread auf Ereignisse reagieren fortgesetzt werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top