Seite 1 von 1
Weitere Frage zu Threading
Verfasst: Sonntag 12. März 2006, 17:05
von SeB
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?
Verfasst: Montag 13. März 2006, 17:30
von SeB
Nanu,
hat keiner eine Idee oder sind die Fragen zu unverständlich/schwammig?
Verfasst: Montag 13. März 2006, 19:42
von Mad-Marty
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
Re: Weitere Frage zu Threading
Verfasst: Dienstag 14. März 2006, 01:33
von gerold
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

Verfasst: Mittwoch 15. März 2006, 16:44
von SeB
Vielen dank Gerold, funktioniert 1a.
Verfasst: Mittwoch 15. März 2006, 17:18
von jens
@gerold: Ich hab es mal in's Wiki geschmissen:
http://wiki.python.de/CPU_Anzeige_%28win32%29
Re: Weitere Frage zu Threading
Verfasst: Dienstag 1. Januar 2013, 14:55
von 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.