Weitere Frage zu Threading

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
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

Folgendes Problem: Ich möchte gewisse Systeminformationen in meiner Applikation zur Verfügung stellen (OS: Windows, also benutze ich dafür wmi). Damit aber beispielsweise beim Abfragen der CPU-Auslastung mein Fenster nicht einfriert, muss ich mit nebenläufigen Threads arbeiten. So weit so gut. Jetzt gibt es aber das Problem das die COM-Dienste nicht Threadsicher sind. D.h. ich kann nicht für jede Abfrage nen neuen Thread öffnen.
Wie ist jetzt das richtige Vorgehen: Sollte ich einen Thread beim Programmstart mitstarten, der alle Funktionen zur verfügung stellt und den ich dann immer pollen muss wenn ich etwas wissen will? Wie ist so ein Thread aufgebaut. Wo wartet er (bei einem Socket wäre es z.B. ein select)? Kennt jemand Beispiele für so ein Vorgehen oder gibt es noch andere Möglichkeiten?
[url=http://therealzordak.de/index.php]therealzordak.de[/url] - [url=http://therealzordak.de/index.php?section=movies]Movies[/url] - [url=http://therealzordak.de/index.php?section=derwahn]Fun[/url]
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

Nanu,
hat keiner eine Idee oder sind die Fragen zu unverständlich/schwammig?
[url=http://therealzordak.de/index.php]therealzordak.de[/url] - [url=http://therealzordak.de/index.php?section=movies]Movies[/url] - [url=http://therealzordak.de/index.php?section=derwahn]Fun[/url]
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

also ich würde zu einem thread tendieren der sekündlich die cpulastt holt, dann brauchst nur noch das threadobject nach dem letzten ergebnis zu fragen mittels einer methode
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

SeB hat geschrieben:Jetzt gibt es aber das Problem das die COM-Dienste nicht Threadsicher sind. D.h. ich kann nicht für jede Abfrage nen neuen Thread öffnen.
Hi SeB!

Ich habe mich mal ein wenig mit CoInitialize() gespielt. (@modelnine: Danke für den Hinweis.)

Das ist dabei raus gekommen (leider schlecht kommentiert, aber es ist schon spät):

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import Tkinter
import threading
import Queue
import win32com.client
import pythoncom
import time



#----------------------------------------------------------------------
class MeinProzessor(threading.Thread):
    
    #----------------------------------------------------------------------
    def __init__(self, q):
        
        threading.Thread.__init__(self)
        self.q = q
        self.cancel = False


    #----------------------------------------------------------------------    
    def run(self):

        pythoncom.CoInitialize()
        try:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
    
            while True:
                if self.cancel:
                    break

                colItems = objSWbemServices.ExecQuery("Select * from Win32_Processor")
                s = ""
                for id, objItem in enumerate(colItems):
                    s += "CPU %s: %s %%\n" % (id, objItem.LoadPercentage)
                self.q.put(s)

                print s

                time.sleep(2)
        finally:
            try:
                pythoncom.CoUninitialize()
            except:
                pass


    #----------------------------------------------------------------------
    def stop(self):
        self.cancel = True


#----------------------------------------------------------------------
class MeinFenster(Tkinter.Tk, threading.Thread):
    
    #----------------------------------------------------------------------
    def __init__(self, q):
        Tkinter.Tk.__init__(self)
        threading.Thread.__init__(self)
        
        self.q = q
        
        self.frame = Tkinter.Frame(self, width = 200)
        self.frame.pack()
        
        self.label1 = Tkinter.Label(
            self, 
            font = ("Arial", "14"), 
            text = "Prozessorauslastung"
        )
        self.label1.pack(expand = True)
        
        self.label2 = Tkinter.Label(
            self, 
            font = ("Arial", "12"), 
            text = "[]"
        )
        self.label2.pack(expand = True)
        
    
    #----------------------------------------------------------------------
    def run(self):

        pythoncom.CoInitialize()
        try:
            while True:
                value = self.q.get()
                if value == "quit":
                    break
                else:
                    self.label2.config(text = value)
        finally:
            try:
                pythoncom.CoUninitialize()
            except:
                pass
            
    
    #----------------------------------------------------------------------
    def stop(self):
        self.q.put("quit")
   


#----------------------------------------------------------------------
def main():
    
    q = Queue.Queue()
    
    mf = MeinFenster(q)
    proc = MeinProzessor(q)

    mf.start()
    proc.start()
    
    mf.mainloop()
    
    proc.stop()
    mf.stop()
    
    print "Ende"


#----------------------------------------------------------------------
if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

Vielen dank Gerold, funktioniert 1a.
[url=http://therealzordak.de/index.php]therealzordak.de[/url] - [url=http://therealzordak.de/index.php?section=movies]Movies[/url] - [url=http://therealzordak.de/index.php?section=derwahn]Fun[/url]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@gerold: Ich hab es mal in's Wiki geschmissen: http://wiki.python.de/CPU_Anzeige_%28win32%29

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ich bin hier gerade über das Wiki hergekommen. Das Beispiel verwendet *drei* Threads und die GUI wird von einem anderen Thread verändert in dem die `mainloop()` läuft. Wenn das absturzfrei läuft ist das Zufall, denn so etwas darf man bekanntlich nicht machen. Das Beispiel sollte IMHO korrigiert oder aus dem Wiki entfernt werden.
Antworten