Python - mache etwas bis zum Tastendruck oder Timeout

9

Ich habe dieses Problem fast gelöst, aber ich denke, ich brauche einen Anstoss in die richtige Richtung.

Ich möchte alle fünf Sekunden etwas tun, bis entweder eine bestimmte Zeit verstrichen ist oder der Benutzer unterbricht es (in diesem Fall beendet es diese Iteration der Schleife) vor dem Beenden).

%Vor%

Ich kann nicht herausfinden, wie diese letzte Zeile funktioniert. Die Verwendung von raw_input() innerhalb der Schleife blockiert solange, bis der Benutzer eingibt, ob der Thread seine Arbeit beendet hat oder nicht. Gibt es ein anderes Modul, das tun wird, was ich will?

Bearbeiten: Ich benutze Windows XP.

    
Benjamin Hodgson 01.08.2012, 11:49
quelle

3 Antworten

2

Hier ist, wie ich das Problem gelöst habe. Ich wollte nicht wirklich zum Modul thread der unteren Ebene wechseln, und ich entschied, dass ich froh war, dass der Benutzer CTRL-C benutzte, um das Programm ordnungsgemäß zu beenden.

Aufgrund der Art und Weise, wie KeyboardInterrupt wiederverwendet wird, ist das ein bisschen wie ein Kompromiss, was bedeutet, dass es nicht wirklich in Code eingebettet werden kann, der CTRL-C als ungeeigneten Exit benötigt. Aber es ist für meine Zwecke in Ordnung.

%Vor%

Update : Es stellte sich heraus, dass es viel einfacher war, eine GUI-Schaltfläche zu verwenden. Der folgende Code beinhaltet nicht die leicht fleckige Umnutzung von KeyboardInterrupt .

%Vor%     
Benjamin Hodgson 01.08.2012, 13:31
quelle
2

Sie können thread.interrupt_main() verwenden.

Beispiel:

%Vor%     
sloth 01.08.2012 12:45
quelle
1

HINWEIS: Ich habe diese Antwort geschrieben, bevor Sie erwähnt haben, dass Sie Windows XP verwenden, und daher wird es Ihnen nicht helfen - select funktioniert nur auf Sockets unter Windows . Ich denke, die Antwort ist immer noch nützlich für andere, also werde ich es hier lassen.

Das wird etwas komplizierter, als ich für Beispielcode schreiben möchte, weil ich sicher bin, dass es etwas Debuggen erfordert, aber ich könnte das Problem auf diese Weise angehen:

Ich würde select in einer Schleife verwenden, die auf sys.stdin wartet, mit einer fünf- zweites Zeitlimit Jedes Mal, wenn es zurückkehrte, wenn keine Eingabe vorhanden war, würde ich den Thread erneut starten (vielleicht prüfen, ob der letzte Thread tatsächlich ausgeführt wurde) und dann die Schleife fortsetzen. Wenn die Eingabe vorhanden wäre, würde ich die Schleife verlassen.

Wenn select anzeigt, dass Input vorhanden ist, könnte ich es entweder als Interrupt flat-out oder read in der Eingabe betrachten und auswerten, ob es sich um eine gültige Unterbrechung handelt oder nicht Eingabe, um eine Unterbrechung abzuschließen. Wenn es eine Unterbrechung ist, würde ich auf den Thread warten, um die Arbeit abzuschließen.

    
zigg 01.08.2012 12:09
quelle