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

Weitere Frage zu Threading

Beitragvon SeB » Sonntag 12. März 2006, 17:05

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

Beitragvon SeB » Montag 13. März 2006, 17:30

Nanu,
hat keiner eine Idee oder sind die Fragen zu unverständlich/schwammig?
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Beitragvon Mad-Marty » Montag 13. März 2006, 19:42

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Weitere Frage zu Threading

Beitragvon gerold » Dienstag 14. März 2006, 01:33

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:

Beitragvon SeB » Mittwoch 15. März 2006, 16:44

Vielen dank Gerold, funktioniert 1a.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 15. März 2006, 17:18

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Re: Weitere Frage zu Threading

Beitragvon BlackJack » Dienstag 1. Januar 2013, 14:55

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.

Wer ist online?

Mitglieder in diesem Forum: __deets__, markjohannes