Threads und Prozesse: Wird das zuverlässig laufen?

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.
wirdbald
User
Beiträge: 4
Registriert: Freitag 29. Februar 2008, 15:06

Threads und Prozesse: Wird das zuverlässig laufen?

Beitragvon wirdbald » 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 :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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Beitragvon Mad-Marty » Donnerstag 13. März 2008, 13:18

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder