j'ai essayer de trouver des tutoriels sur le net comment bien utilisé les threads, mais je trouve rien qui semble intéressant, avez-vous un suggestion?
Voici un exemple de ce que j'ai faite en python (quoi la logique doit être similaire pour les autre language). Ca roule a l'intérieur d'un application graphique(wxwidget). Le programme intéroge dans un liste de serveur, les information relative a sus-update ; quand le prochain check, quand la prochaine installation, si le service est up.
Parcontre, quand je pogne un systeme ou le wmi interdit l'access, je pogne un time out de 2 minutes et le programme "gèle" en attendant.
Alors ce que j'ai faite, ou plutot essayer, c'est de lancé mommentanément 2 threads en meme temps, de cette facon, si un coincerait sur un time out, l'autre continurait de remplir la liste. Sauf, ca marche pas. Ca créé la liste, il y a pas de toute, et mon application ne gèle plus car le thread graphique la rend réactive, sauf que lors d'un timeout, on dirait que les deux thread sont bloqué.
voici mon code :
logique: fill_ctrl, démarre un progress bar(2lignes) et ensuite il démarre le listing de la fonction fill_ctrl2 dans un thread pour ne pas mettre le gui en otage
la fonction fill_ctrl2 prend différent chemin si il s'agit d'un fichier ou d'un simple host. Dans le cas du fichier, il démarrage un boucle for pour la liste de host et démarre des threads pour qu'ils soient idépendant et qu'il ne bloque pas durant les timeouts. Mais voila, ma comprehension des threads me semble eroné, car j'arrive pas au résultat escompté.
fill_ctrlr ne fait qu'afficher les infos dans le listbox du gui
Code :
def fill_ctrl(self, event):
self.progressbox= loading_box.loading_box(self)
thread.start_new(self.newbox.Show, (1, ))
thread.start_new(self.fill_ctrl2, (None,))
def fill_ctrl2(self, event):
# get data
self.server_list_ctrl.DeleteAllItems()
if configdict['type'] == 'file':
fileobject = fileman.fileman(configdict['host_filename'])
hostlist = fileobject.getserverinfo()
getinfo_manipulator = getinfo.getinfo(keypath)
for host in hostlist:
thread.start_new(self.fill_ctrlr, (getinfo_manipulator, host))
print "get in" + host
else:
if self.server_name_text_ctrl.GetValue() != '':
configdict['host_filename'] = self.server_name_text_ctrl.GetValue()
getinfo_manipulator = getinfo.getinfo(keypath)
thread.start_new(self.fill_ctrlr, (getinfo_manipulator, configdict['host_filename']))
# set data
self.progressbox.Destroy()
def fill_ctrlr(self, getinfo_manipulator, host):
infolist = getinfo_manipulator.getinfo(host)
index = self.server_list_ctrl.InsertStringItem(0,infolist[0])
self.server_list_ctrl.SetStringItem(index,1,infolist[1])
self.server_list_ctrl.SetStringItem(index,2,infolist[2])
self.server_list_ctrl.SetStringItem(index,3,infolist[3])
self.server_list_ctrl.SetStringItem(index,4,infolist[4])