Pause toggle

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
wg01
User
Beiträge: 7
Registriert: Sonntag 19. August 2012, 11:35

Hi Leute,

ich bin ein totaler Python-Newbie und möchte einige AutoIt-Scripte in Python neu schreiben.
Das geht soweit ganz gut, jedoch bei der Funktion 'HotKeySet(key, function)' taucht die Frage auf,
wie ich das in Python abbilden kann.

Was HotKeySet tut: beim Drücken der Hotkey-Taste
*wird die Abarbeitung des laufenden Scriptes angehalten und die in HotKeySet angegebene Funktion ausgeführt*.
Das ist der springende Punkt: 'anhalten des laufenden Scriptes'.

Ich habs probiert mit suspend/resumeThread, das klappt aber nicht.

Das Ganze soll dazu dienen, ein laufendes Script zu einem beliebigen Zeitpunk durch Drücken der Pausetaste anzuhalten und durch ein weiteres Drücken der Pausetaste das Script weiterlaufen zu lassen.

In C/C++ würde ich das mit einem Signalhandler machen...

Frage: wie könnte ein Lösungsansatz aussehen?

Danke fürs Lese und Tipps
Wolf
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
wg01
User
Beiträge: 7
Registriert: Sonntag 19. August 2012, 11:35

darktrym hat geschrieben:Evtl. über Prozesse und Signale.
Danke; leider bin ich auf Windows 7.
Hab's probiert (siehe code), bring error 'ValueError: invalid signal value'

Code: Alles auswählen

import os, signal

def h(s, f): 
    print("s=%s f=%s" %(s, f))

signal.signal(signal.CTRL_BREAK_EVENT, h)
pid = os.getpid()
  
print("PID=%d" %(pid))
os.kill(pid, signal.CTRL_BREAK_EVENT)

print("END")
Unter Linux mit 10 (SIGUSER1) gehts wie's soll...

Hat noch jemand eine Idee?

Danke,
Wolf
lunar

@wg01 Gewöhne Dir bitte an, den kompletten Traceback zu zeigen, nicht nur den Teil, den Du für wichtig hältst. Es wäre beispielsweise wichtig, zu wissen, in welcher Zeile Deines Quelltexts der Fehler auftritt.

Laut Dokumentation lässt sich "CTRL_BREAK_EVENT" nur mit "os.kill()" verwenden:
The signal corresponding to the CTRL+BREAK keystroke event. This signal can only be used with os.kill().
Mithin kannst Du es nicht als Argument an "signal.signal()" übergeben.

Ich sehe gerade nicht so richtig, wo Dein Problem ist. Du willst das Skript bis zum Auftreten eines bestimmten Ereignisses anhalten? Gut, dann musst Du doch nur synchron auf dieses Ereignis warten. Wie genau das aussieht, hängt von der Art Deines Skripts ab, und dazu hast Du bist jetzt nichts weiter gesagt. Läuft das Skript im Terminal, hat es eine graphische Oberfläche, oder läuft es vollständig im Hintergrund? In jedem dieser Fälle gibt es eine andere, mehr oder weniger komplizierte Lösung, um das Skript bis zu einem Tastendruck anzuhalten.
wg01
User
Beiträge: 7
Registriert: Sonntag 19. August 2012, 11:35

lunar hat geschrieben:@wg01 Gewöhne Dir bitte an, den kompletten Traceback zu zeigen,...
Ah ja, hast recht, da war ich nachlässig...
lunar hat geschrieben:Mithin kannst Du es nicht als Argument an "signal.signal()" übergeben.
Ja, habs dann auch in der Doku gesehen.

Also das Programm (Objekterkennung) soll folgendes tun:

Scannen von Bildern (tausende) über C-Scnittstelle.
Der 64x64 Pixel grosse Bereich, der aktuell gescannt wird, wird durch ein Rechteck gekennzeichnet. Das Rechteck wandert sozusagen durchs Bild.
Das Scanresultat wird pro Schritt in einem GUI dargestellt.
>>> Offener Punkt: da sollte man das Ganze anhalte können, um zu sehen was der Scan erkannt hat.

Das Ganze ist z.Zt. teilweise schon mit AutoIt realisiert, insbesondere der Punkt Pause/Resume Verarbeitung.
Ich will's jedoch in Python sehen.
lunar hat geschrieben:...dann musst Du doch nur synchron auf dieses Ereignis warten...
Wie geht das?
Z.Zt. sehe ich fürs Abfangen von WindowsEvents (Kbd/Mouse) unter tk die Funktion mainloop() odert mit pythoncom Pump[Waiting]Messages().

Pause/Restart geht damit aber nur nach PumpMessages()/mainloop() und nicht an einem beliebigen Punkt im Programm.

Noch Ideen?

Danke für Tipps
Wolf
wg01
User
Beiträge: 7
Registriert: Sonntag 19. August 2012, 11:35

OK, mit threading erledigt.
Antworten