Seite 1 von 1

QCopChannel hängt

Verfasst: 1. September 2011 11:40
von Ghal_Maraz
Hallo,

ich versuche zur Zeit über den QCopChannel zwei Anwendungen zu verbinden. Dabei registrier ich in jeder Anwendung je einen Channel. Die erste Anwendung schickt nun Anfragen an die Zweite. Die Zweite antwortet (nur).
Generell funktioniert das ganz gut, aber sobald ich zu viele Anfragen auf einmal absetzen will bleiben die Anwendungen hängen. Ich nehme an das hat etwas damit zu tun, dass beide Anwendungen gleichzeitig versuchen Nachrichten abzusetzen.
Beende ich eine der Anwendungen nach dem Crash über die Shell mit Strg+C erscheint die Meldung "QWSLock::lock: Invalid argument". Hat jemand eine Ahnung was da schief geht? Sieht ja ziemlich nach einem Deadlock aus.

Ich bin für jede Hilfe dankbar.

MfG Ghal Maraz

Re: QCopChannel hängt

Verfasst: 6. September 2011 09:03
von Ghal_Maraz
Nachdem ich mein Programm ein wenig umgestellt und im Virtual Framebuffer debuggt habe, habe ich die Stelle gefunden, an der das Programm hängen bleibt. Beim Aufruf von QCopChannel::isRegistered() wird eine Anfrage an den QCopChannel QLatin1String("") gesendet und anschließend die Function waitForQCopResponse() aufgerufen. Dort hängt er in einer for(;;)-Schleife und pollt nach einer Anwort, die nie ankommt.

EDIT:
Nachdem ich ein wenig weiter geforscht habe, habe ich die Ursache gefunden. Ich benutze eine systemweite Semaphore in den beiden Anwendungen. Während des Zugriffs auf den CopChannel belegt die anfragende Anwendung diese Semaphore. Nun kann es passieren, dass die andere Anwendung an einer Stelle ist, an der sie ebenfalls die Semaphore braucht. Diese Anwendung ist dummerweise im Besitz des QWSServers, der nun während die Anwendung in der Semaphore hängt auch nicht auf die CopChannel-Anfragen der ersteren Anwendung anworten kann.

Schließen und am besten gleich löschen ;-)