Nous sommes actuellement le 10 Juil 2026, 17:22

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 3 message(s) ] 
Auteur Message
 Sujet du message: Thread, comment ca marche?
MessagePublié: 15 Fév 2005, 14:31 
Hors-ligne
Répond à tout!
Répond à tout!

Inscription : 10 Jan 2002, 14:09
Message(s) : 2386
Localisation : Verdun
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])


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Fév 2005, 15:43 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Je n'ai pas fais de ce genre de programmation depuis très longtemps et même a cette époque c'était très limité !

Si vous avez uniquement cherché à propos de thread, en attendant que quelqu'un réponde vous pouvez faire une tentative avec "Concurrent Programming". C'est le nom général relié aux méthodes de programmation par threads.

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message: Re: Thread, comment ca marche?
MessagePublié: 15 Fév 2005, 16:41 
Hors-ligne
A réponse à tout!
A réponse à tout!
Avatar de l’utilisateur

Inscription : 14 Mars 2002, 22:24
Message(s) : 3308
Localisation : Québec
Il y a potentiellement plusieurs problèmes dans le code...

Je n'ai jamais programmé avec des threads en python par contre.. ce que je vais dire va être plutôt général.

Affichage graphique :
Habituellement, l'affichage d'une application graphique se fait déjà à partir d'une thread à part... si tu as utilisé pygtk ou pyqt, il me semble qu'il y a un appel à pygtk.main_loop() ou quelque chose du genre. Cette fonction là part une thread et affiche le dialogue de base normalement.

Donc, il est inutile de partir une thread pour afficher le dialogue. Ce qui peut bloquer un affichage, c'est lorsqu'on affecte une fonction à un bouton et que le code de ce bouton part dans une boucle. Habituellement, l'affichage du programme est paralysé jusqu'à ce que la fonction retourne ou si on force manuellement le rafraîchissement de la fenêtre.

D'après ce que j'ai compris de ton code, tu veux afficher un dialogue qui contient seulement un progressbar et après, tu démarre la fonction qui récupère les données. Il n'y a donc aucune fonction appelée par le main loop de l'affichage.

Thread :
Tu dis que lorsqu'il y a un timeout, tout gèle... je ne pourrais pas dire de quelle place ca pourrait venir, mais il y a certains problèmes au niveau de la thread.

À chaque fois que tu reçoit une donnée, tu part une nouvelle thread pour mettre à jour le progress_bar, ce qui est tout à fait inutile. À la place, ca serait mieux d'utiliser des messages... au lieu de partir une nouvelle thread, tu envoie un message au dialogue pour lui dire de mettre ses données à jour...

Je ne sais pas non plus à quel moment la connection se crée, mais ca semble être avec le code hostlist = fileobject.getserverinfo() ou getinfo_manipulator = getinfo.getinfo(keypath). Normalement, l'exécution devrait bloquer sur ces deux fonctions, mais ne pas affecter la partie graphique.

_________________
Linux 2.6.22 debian gcc 4.2
KDE 3.5.7 / xorg-x11 7.3


Haut
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 3 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site