1

xbmc 用の python サービスを開発していますが、どうしようもなく立ち往生しています。XBMC には、JSON-RPC で通信する TCP API があります。XBMC には、主にコマンドを受信して​​応答するように設計されたサーバー TCP ソケットがありますが、システムで何かが発生すると、「通知」を TCP に送信します。問題は、サーバーのように動作する TCP クライアントを作成する必要があるため、この「通知」を受信できることです。コードをループする必要があるため、どこで実行socket.recv(4096)してもデータを待機し、コードがスタックします。コードの構造は基本的に次のようになります。

import xbmc, xbmcgui, xbmcaddon

class XPlayer(xbmc.Player) :   
    def __init__ (self):
        xbmc.Player.__init__(self)
    def onPlayBackStarted(self):
        if xbmc.Player().isPlayingVideo():
            doPlayBackStartedStuff()

player=XPlayer()
doStartupStuff()

while (not xbmc.abortRequested):
    if xbmc.Player().isPlayingVideo():
        doPlayingVideoStuff()
    else:
        doPlayingEverythingElseStuff()

    xbmc.sleep(500)
    # This loop is the most essential part of code

if (xbmc.abortRequested):
    closeEverything()
    xbmc.log('Aborting...')

スレッド化、マルチプロセッシング、ブロッキング、ノンブロッキングのすべてを試しましたが、何も役に立ちませんでした。ありがとう、

4

1 に答える 1

1

select()、poll()、またはepoll()が必要になる可能性があります:http: //docs.python.org/library/select.html

このPythonpipe-progress-meterアプリケーションは、例としてselectを使用します: http ://stromberg.dnsalias.org/~strombrg/reblock.html

プロトコルのさまざまな部分を区切る区切り文字の種類がわかっている場合は、selectなどを必要とせずにこれが役立つこともあります。http: //stromberg.dnsalias.org/~strombrg/bufsock.html かなりお得です「次のヌルバイトまで読み取る」、「最大100バイトを読み取る」などで優雅に。

于 2012-07-03T20:51:37.363 に答える