Salut à toute la communauté des développeurs,

Voilà je viens vous soumettre un code sur lequel je bloque depuis quelques jours. Celui génère une erreur dont je n'arrive pas à bout...

Il s'agit en fait d'appeler une fonction dans un Thread pour qu'elle puisse s'exécuter dans le même temps que le Thread principal continue. Le problème c'est que la fonction, ici CTRL_DD(), fait appel à la bibliothèque win32com dont les éléments semblent ne pas accepter d'être exécuté ailleurs que dans le Thread principal.

J'espère que vous aureez de l'inspiration, je suis vraiment à cours de ressources...


Merci.

L'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python24\lib\threading.py", line 442, in __bootstrap
    self.run()
  File "C:/Documents and Settings/adm/Bureau/Jérémy - Stage/Python/Projet_CTRL/test Dutonia 3.pyw", line 69, in run
    print self.nom()
  File "C:/Documents and Settings/adm/Bureau/Jérémy - Stage/Python/Projet_CTRL/test Dutonia 3.pyw", line 14, in CTRL_DD
    objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
  File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File "C:\Python24\Lib\site-packages\win32com\client\dynamic.py", line 98, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\Python24\Lib\site-packages\win32com\client\dynamic.py", line 78, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
com_error: (-2147221008, "CoInitialize n'a pas \xe9t\xe9 appel\xe9.", None, None)
Le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
 
import time, threading
import wx
import win32com.client
 
def CTRL_DD():
		"Controle de l'espace disque et annonce d'une surcharge ou non."
		print "CTRL_DD"
		help = "Controle l'espace restant d'un disque et annonce son etat de charge."
 
		strComputer = "."
		objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
		objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
		print "salut"
		colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
 
		fp = file('ARG_CTRL_DD.txt')
		Pourcentage = fp.readline(1024)
		NomDisk = fp.readline(1024)
 
		for objItem in colItems:
				#On vérifie si le volume est un disque dur (Type3:DD)
				if objItem.DriveType == 3:
						NomDisk = str(NomDisk) + ":"
						Volume = objItem.Name
 
						Espace = float(objItem.Size)
						Libre = float(objItem.FreeSpace)
						Occupe = Espace - Libre
 
						Pourcentage = "0." + str(Pourcentage)
						Pourcentage = float(Pourcentage)
 
						Alerte = Espace - (Espace * Pourcentage)
						Go = 1000000000
						i = 0
						if NomDisk == Volume:
								i += 1
								commentaire =  "(" + str(Volume) + " " + str(int(Occupe/Go)) + "/" + str(int(Espace/Go)) + "Go)"
								SurfUtil = str(100 - int(Libre/Espace*100))
								if Espace != None:
										if Libre <= Alerte:
												commentaire = "Disque en surcharge" + str(commentaire)
												retour = "CTRL_DD-False-" + commentaire + "-"  + help
												return retour
										else:
												commentaire =  "Il y a suffisament d'espace sur le disque" + str(commentaire)
												retour = "CTRL_DD-True-" + commentaire + "-"  + help
												return retour
						elif i == 0:
								commentaire = "Le disque " + NomDisk + " n'existe pas"
								retour = "CTRL_DD-False-" + commentaire + "-" + help
								return retour
 
def FonctSalut():
		print "salut"
 
class ThreadSonde(threading.Thread):
	def __init__(self, nom):
		threading.Thread.__init__(self)
		self.nom = nom
 
	def run(self):
		i=0
 
		while i < 10:
			print self.nom()
 
			print i
			time.sleep(5)
			i+=1
 
#Ici, ça fonctionne, mais ce n'est pas dans le ThreadSonde
#while i<10: sera remplacé plus tard par un evt while i=True:
i=0
while i < 10:
	print self.nom()
 
	print i
	time.sleep(5)
	i+=1
 
T_S = ThreadSonde(CTRL_DD)
T_S.start()