IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pb de thread :/


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Pb de thread :/
    Bonjour à tous,

    Voila, j'ai un petit pb avec les thread, je n'arrive pas a les lancer correctement.
    Voici mon code (très simplifié):

    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
     
    import wx
    import threading
     
    class mainFrame(wx.Frame):
        def __init__(self, parent, id, title, param):
            #initialisation de l'interface graphique
     
        def OnSelectFile(self, event):
            #selection d'un fichier a uploader
     
        def OnStart(self, event):
            #lancement du thread de travail
            a = threading.Thread(None, Upload, None, (self.tc.GetValue(), self))
            a.start()
     
        def OnExit(self, event):
            self.Close()
     
    class ShowFrame():
        def __init__(self, parent):
            app = wx.App()
            MainWindow = mainFrame(None, -1, 'Uploader', parent)
            app.MainLoop()
     
    class Upload(threading.Thread):
        def __init__(self, fichierpath, frame):
            threading.Thread.__init__(self)
            print "upload"
            frame.Gt.SetLabel("Upload en cours...")
            return 1
    la fonction "upload" ne se lance pas,
    Aurriez vous une idée du pourquoi du comment ?
    Merci =)

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    il y a plusieurs choses qui ne vont pas en fait. pour faire un thread, tu as en gros deux façons différentes de faire:

    - soit tu instancies la classe Thread en lui donnant la fonction avec ses arguments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t = threading.Thread(target=myfunc,args=(0,1),kwargs={'option':True})
    - soit tu hérites de la classe Thread et tu redéfinis la méthode run (elle ne peut pas prendre d'arguments en plus du 'self', donc tu peux passer les arguments de run à l'instanciation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyThread(threading.Thread):
        def __init__(self, args=None, kwargs=None):
            threading.Thread.__init__(self)
            self._args = args
            self._kwargs = kwargs
        def run(self):
            # tu fais ce que tu veux avec self._args et self._kwargs
            pass
     
    t = MyThread(args=(0,1),kwargs={'option':True})
    ensuite, pour lancer le Thread:

    cette commande est non bloquante (c'est un peu l'interêt des Thread), pour rendre l'éxécution bloquante:

    Dans ton code, j'ai l'impression que tu as mélangé un peu les deux approches

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Merci
    j'avoue que je m'embrouille un peu, je n'avais jammais fais de thread

    Déjà, j'arrive a lancer mon thread
    Par contre il ne se déroule pas comme je voudrai:

    a la fin du thread (if(urllib2.....)) la mention "Upload Completed" s'affiche, mais la gauge ne se met a 99% qu'une fois/X

    Autre pb, a la fin de l'upload, si je souhaite selectionner un nouveau fichier, le fenettre de selection est completement buguée (comme si un while(1) tournais (ne reponds pas...))

    Voici 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
    class mainFrame(wx.Frame):
        def __init__(self, parent, id, title, param):
            #initialisation de la frame#
            self.tc = wx.TextCtrl(panel, -1, "/")
            #[...]#
     
            #Partie texte
            self.Gt = wx.StaticText(panel, -1, 'Wait To Go')
            #[...]#
     
            #Partie Gauge
            self.gauge = wx.Gauge(panel, -1, 100, size=(250, 25))
            #[...]#
     
            #Les Events des bouton selection et start
            panel.Bind(wx.EVT_BUTTON, self.OnSelectFile, id=4)
            panel.Bind(wx.EVT_BUTTON, self.OnStart, id=1)
            #[...]#
     
     
        def OnSelectFile(self, event): # wxGlade: MyFrame1.<event_handler>
            wildcard = "All files (*.*)|*.*|" \
                "Fichiers textes (*.txt)|*.txt"
            dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), 
                "", wildcard, wx.OPEN)
     
            if dialog.ShowModal() == wx.ID_OK:
                self.tc.SetValue(dialog.GetPath())
            event.Skip()
     
        def OnStart(self, event):
            self.gauge.SetValue(1)
     
            t = CryptAndUpload(args=(self.tc.GetValue(), self),kwargs={'option':True})
            t.start()
     
            time.sleep(0.1)
            self.Gt.SetLabel("Upload en cours...")
            self.gauge.SetValue(10)
     
        def OnExit(self, event):
            self.Close()
     
    class CryptAndUpload(threading.Thread):
        def __init__(self, args=None, kwargs=None):
            threading.Thread.__init__(self)
            self._args = args
            self._kwargs = kwargs
     
        def run(self):
            fichierpath = self._args[0]
            frame = self._args[1]
            data = {'name': 'fichier_0',
            'file':  open(fichierpath)}
            if(urllib2.urlopen(frame.param.serverUploadPath, data)):
                frame.gauge.SetValue(99)
                frame.Gt.SetLabel("Upload completed!")
     
    class ShowFrame():
        def __init__(self, parent):
            app = wx.App()
            MainWindow = mainFrame(None, -1, 'CryptUploader', parent)
            app.MainLoop()

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo