Seite 1 von 1

Threads und Prozesse: Wird das zuverlässig laufen?

Verfasst: Sonntag 9. März 2008, 17:05
von wirdbald
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 :wink:

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

Verfasst: Donnerstag 13. März 2008, 13:18
von Mad-Marty
Hi,

Ich bezweifel das das stoppen funktioniert, was soll PyBarchive.kill eigentlich sein?

warum stoppst du den Prozess nicht per windows message?

Dafür könntest du die WindowsMessage WM_SHUTDOWN senden.