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?
Weitere Frage zu Threading
-
- User
- Beiträge: 25
- Registriert: Mittwoch 24. August 2005, 14:29
- Wohnort: Buchenau/Hessen
- Kontaktdaten:
[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]
-
- 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?
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]
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi SeB!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.
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()
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- 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]
- 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
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.