waittill?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
noob1
User
Beiträge: 9
Registriert: Mittwoch 9. Juli 2008, 09:24

Hallo Leute,

in der Script-Sprache codscript für Call of Duty gibt es das Konstrukt "waittill", welches ich gerne identisch in Python nutzen möchte, um ein Spiel zu scripten.

Es funktioniert in CoD so:

Code: Alles auswählen

while (1)
{
    trigger waittill("trigger", player);
    player print("Du berühst den Trigger!!!");
}
Wie sollte man sowas in Python implementieren?

Viele Grüße,
noob1
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Du könntest eine Liste der Funktionen haben, die von einem Trigger aufgerufen werden. An der Stelle, wo das Auslösen bemerkt wird, gehst du einfach die Liste durch und führst die Funktion aus. In Python selbst, und den meisten Framworks, sind das dann "Signale".
noob1
User
Beiträge: 9
Registriert: Mittwoch 9. Juli 2008, 09:24

Ich möchte den Thread aber einfach beenden können, ohne darüber nachzudenken, auf welche waittill's er grad wartet.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ein bisschen Pseudo Code:

Code: Alles auswählen

def on_touched(message):
    print(message)

def other_slot(message):
    print("The other ...")
    print(message)

def do_something():
    trigger = Signal()
    trigger.connect(on_touched)
    trigger.connect(other_slot)
    while True:
        do_somethinge_else()
        if condition_fullfilled():
            trigger("Touched")
Wobei 'Signal' entweder selbst zu implementieren ist oder aus irgendeiner Bibliothek stammen kann.

So in der Art würde ich Dein Problem angehen.

Allerdings hängt auch vieles von der aufrufenden Umgebung ab. Es liest sich nicht danach, als wenn du das Pythonprogramm direkt aufrufst.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
noob1
User
Beiträge: 9
Registriert: Mittwoch 9. Juli 2008, 09:24

Also wie schon im Beitrag davor gesagt, das Problem ist, dass das Signal nicht gelöscht wird, sobald man den Thread beendet.

"waittill" vereint das alles. Leider ist Python wohl nicht dynamisch genug.
BlackJack

@noob1: Ich wüsste jetzt nicht was das mit „dynamisch” zu tun hat. Wenn man will und kann, lässt sich das sicher lösen. Das `weakref`-Modul könnte dabei nützlich sein.
noob1
User
Beiträge: 9
Registriert: Mittwoch 9. Juli 2008, 09:24

Ich will das nicht "irgendwie" lösen, sondern mit trigger.waittill().
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Womit das von BlackJack angesprochene "will" ausfällt.
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Womit das von BlackJack angesprochene "will" wohl nicht vorhanden ist
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist immer gut, wenn man einzelne Anforderungen nur stückchenweise verrät.
Ich hab immer noch keinen Plan, was der Fragesteller eigentlich erreichen will.

Naja, ich hab trotzdem die einzig richtige Lösung gefunden:
waittill heißt in Python yield.

Code: Alles auswählen

class SignalHandler(object):
    def __init__(self):
        self.workers = {}

    def handle(self, worker):
        self.workers[worker] = next(worker)

    def emit(self, target, signal):
        active = [worker
                  for worker, target_signal in self.workers.iteritems()
                        if target_signal == (target, signal)]
        for worker in active:
            try:
                self.workers[worker] = next(worker)
            except StopIteration:
                pass



trigger1 = "Button A"
trigger2 = "Button B"

def hidden_quest():
    while True:
        print "Press Button A"
        yield trigger1, 'trigger'
        print "Triggered"
        print "Now press Button B"
        yield trigger2, 'trigger'
        print "Triggered"


signal_handler = SignalHandler()
signal_handler.handle(hidden_quest())

signal_handler.emit(trigger1, 'trigger')
signal_handler.emit(trigger2, 'push') # nothing happens
signal_handler.emit(trigger2, 'trigger')
signal_handler.emit(trigger1, 'trigger')
------
endlich den ronie-Knopf hier im Forum gefunden
noob1
User
Beiträge: 9
Registriert: Mittwoch 9. Juli 2008, 09:24

Danke Sirius3, das sieht sehr vielversprechend aus. :)
Antworten