Threads und Prozesse: Wird das zuverlässig laufen?
Verfasst: Sonntag 9. März 2008, 17:05
Hallo zusammen,
ich bastel mir grade ein Programm, welches ein anderes Programm starten, die Ausgabe lesen und gegebenenfalls das Programm abbrechen soll. Das ganze soll von der GUI aus gesteuert werden. Deshalb muss ich mit mehreren Threads arbeiten, was für mich Neuland ist. Es wäre Klasse, wenn sich das mal einer ansehen könnte.
Ich habe die Funktionen um die es geht mal aus den Klassen rausgepickt und ich wäre dankbar für herbe Kritik, die mich weiterbringt
Die Funktion callExe wird von außen aufgerufen und bekommt eine Funktion übergeben, der sie stückweise die Ausgabe des Programms übergeben soll ("observerFct") und eine zweite Funktion ("stoptester"), mit der eine Bool-Variable abgefragt wird, die gegebenenfalls einen Abbruch signalisiert. In diesem Fall würde der Prozess mit der passenden Windows-Funktion abgeschossen und der Thread, der den Output liest ("readprocess") hört hoffentlich von alleine auf.
Wird das so funktionieren und wird der zweite Thread auch sauber beendet?
ich bastel mir grade ein Programm, welches ein anderes Programm starten, die Ausgabe lesen und gegebenenfalls das Programm abbrechen soll. Das ganze soll von der GUI aus gesteuert werden. Deshalb muss ich mit mehreren Threads arbeiten, was für mich Neuland ist. Es wäre Klasse, wenn sich das mal einer ansehen könnte.
Ich habe die Funktionen um die es geht mal aus den Klassen rausgepickt und ich wäre dankbar für herbe Kritik, die mich weiterbringt
Die Funktion callExe wird von außen aufgerufen und bekommt eine Funktion übergeben, der sie stückweise die Ausgabe des Programms übergeben soll ("observerFct") und eine zweite Funktion ("stoptester"), mit der eine Bool-Variable abgefragt wird, die gegebenenfalls einen Abbruch signalisiert. In diesem Fall würde der Prozess mit der passenden Windows-Funktion abgeschossen und der Thread, der den Output liest ("readprocess") hört hoffentlich von alleine auf.
Wird das so funktionieren und wird der zweite Thread auch sauber beendet?
Code: Alles auswählen
import string, subprocess, threading
from ctypes import windll
def kill(pid):
"""kill process on Win32"""
h = windll.kernel32.OpenProcess(1,0,pid)
if not h:
return False
return windll.kernel32.TerminateProcess(h,0) != 0
def readprocess(process, logFct):
'''Reading output of the given process and writing to logFct'''
line = process.stdout.readline()
while line:
if line.strip() != "":
logFct(line)
line = process.stdout.readline()
def callExe(observerFct=None,stoptester=None):
'''Calling some process and writing output to observerFct'''
# Creating wrapper of observerFct
def write(s):
if observerFct != None:
observerFct(s)
# Calling something.exe
CREATE_NO_WINDOW=0x8000000
p = subprocess.Popen("something.exe",
stdout=subprocess.PIPE,
creationflags=CREATE_NO_WINDOW)
# Opening new thread to read output
ReadThread = threading.Thread(target=readprocess, args=(p,write))
# Waiting for stop-signal or regular termination
while not stoptester() and p.poll()==None:
time.sleep(0.1)
# Received Stop-Signal?
if stoptester():
if p.poll()!=None:
PyBarchive.kill(p.pid)
write("Aborted!")
# Wait for other thread
ReadThread.join(0.5)
return True