Auf Event in anderem Thread warten

06/04/2010 - 00:32 von Michael Ziegler | Report spam
Hallo NG,

ich baue grade ein Programm, das zu einem Battlefield BC2-Server per
RCon verbinden und ein RPC-Interface zu einem Webinterface bereitstellen
soll.

Der Server sendet über diese Verbindungen gern mal Event-Nachrichten
(Spieler betritt/verlàsst das Spiel, killt anderen Spieler), sowie die
Antworten zu gesendeten Befehlen. Das zu verarbeiten ist kein Problem,
mein Programm arbeitet dazu komplett asynchron und behandelt Events und
Befehle soweit richtig. Wenn ich einen Befehl absetzen will, übergebe
ich dessen Daten meinem Verbindungsthread, dieser sendet den Befehl ab
und ruft eine beliebige Callback-Funktion mit der Antwort auf:

| def printresult( words ):
| print "Command returned:", words
|
| serv.asynccommand( ["admin.listPlayers", "all"], success=printresult )

Wenn der Server den Befehl beantwortet hat, wird printresult aufgerufen
und das Ergebnis ausgegeben. Soweit funktioniert's. :)

Ich hàtte allerdings gern eine Klasse, die die einzelnen Befehle kennt
und brauchbar als Funktionen anbietet. Dazu müsste ich einen Befehl
absetzen, auf das Ergebnis warten, das Ergebnis verarbeiten und dann
zurückgeben.

Mir schwebt etwas vor wie das:

| class Bfbc2Rcon( object ):
| def admin_listPlayers( self ):
| # ???
| return playerliste

Bloß wie? Wie warte ich in meiner Funktion auf den Aufruf der
Callback-Funktion, was sollte die Callback-Funktion tun, und wie komme
ich dann sinnvoll ans Ergebnis dran damit es returnt werden kann?

Ist der ganze Ansatz so überhaupt sinnvoll, oder sollte ich irgendwie
anders an die Sache rangehen?

Grüße,
Michael
 

Lesen sie die antworten

#1 Thomas Rachel
06/04/2010 - 10:14 | Warnen spam
Am 06.04.2010 00:32, schrieb Michael Ziegler:
Bloß wie? Wie warte ich in meiner Funktion auf den Aufruf der
Callback-Funktion, was sollte die Callback-Funktion tun, und wie komme
ich dann sinnvoll ans Ergebnis dran damit es returnt werden kann?



Klingt nach einer Verwendung für ein sog. "Future". Siehe dazu auch
<http://de.wikipedia.org/wiki/Future_(Programmierung)>.

Dein Kommando

def admin_listPlayers( self )

(BTW: komische Klammerung machst Du da - wozu dienen diese Leerzeichen?)

könnte minimalst wie folgt aufgebaut sein:


def admin_listPlayers(self):
r=[] # Result
serv.asynccommand(["admin.listPlayers", "all"],
success=r.append)
return r

Zurückgegeben wird eine Liste, die zunàchst leer ist. Wenn das Ergebnis
dann bekannt ist, wandert es in die Liste.

Wie gesagt, das ist die Minimalumsetzung. Sinnvoll wàre es auf jeden
Fall, das als eigene Klasse umzusetzen, die a) noch eine
threading.Condition besitzt und b) vielleicht sogar die Möglichkeit,
selber einen Listener dranzuflanschen.

HTH,


Thomas

Ähnliche fragen