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

GUI Python Discussion :

GUI et multithread


Sujet :

GUI Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut GUI et multithread
    Bonjour,

    Pour un projet, j'essaye de lier du multithread à une interface graphique. Voici l'idée du projet : On modélise un restaurant par un serveur python. Des clients peuvent se connecter au serveur pour commander leur repas. Chaque client est livré par un livreur. Il y a un nombre fini de livreur, si tous les livreurs sont occupés, les nouveaux clients doivent attendre. Pour l'instant, je ne suis qu'au début du développement. J'ai mon serveur et mon client. Le client se connecte au serveur et reste connecté un certain temps jusqu'a etre livré. Comme plusieurs clients peuvent se connecter en même temps, je gère cela par du multithread.

    Mon probleme arrive lorsque je veux lier ce code à une interface graphique. En effet, j'aimerais faire une interface assez simple mais dynamique qui permet de voir la liste des clients qui se connectent, qui sont en attente de livraison ou qui ont été livrés et la liste des livreurs qui sont disponibles ou non. Le problème est que j'ai fait cette interface sous Tkinter et lorsque j'appelle des fonctions de mon interface dans ma fonction thread, j'obtiens l'erreur : main thread is not in main loop.
    Après quelques recherches, j'ai trouvé que Tkinter a bien un probleme avec le multithread mais je n'ai pas du tout compris la solution apportée par les internautes...
    Je voudrais donc savoir s'il y a une solution "simple" ou un autre module que Tkinter qui pourrait faire l'affaire.

    Merci

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Si tu n'es pas tenue à TKinter, alors je te recommande PyQt.

    http://pyqt.developpez.com/tutoriels/

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par fgallais Voir le message
    Après quelques recherches, j'ai trouvé que Tkinter a bien un probleme avec le multithread mais je n'ai pas du tout compris la solution apportée par les internautes... Je voudrais donc savoir s'il y a une solution "simple" ou un autre module que Tkinter qui pourrait faire l'affaire.
    Quelque soit le GUI (tk, Qt,...) il n'est pas recommandé:
    - d'utiliser pour le GUI un autre thread que le thread principal,
    - d'effectuer des mises à jour des widgets depuis des threads secondaires.

    Citation Envoyé par fgallais Voir le message
    Le client se connecte au serveur et reste connecté un certain temps jusqu’à être livré. Comme plusieurs clients peuvent se connecter en même temps, je gère cela par du multithread.
    Rien ne vous empêche de démarrer le GUI et le serveur dans un thread secondaire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je crois que je n'ai très bien compris la notion de thread.
    Pour moi on a un serveur, et dès qu'un client se connecte, on crée un nouveau thread. Le problème est qu'une fois qu'un client est connecté, il lui arrive des choses, et je veux que ça se voit sur l'interface graphique. Donc je n'arrive pas à comprendre comment l'interface graphique pourrait etre gérée à l'extérieur...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par fgallais Voir le message
    Pour moi on a un serveur, et dès qu'un client se connecte, on crée un nouveau thread. Le problème est qu'une fois qu'un client est connecté, il lui arrive des choses, et je veux que ça se voit sur l'interface graphique. Donc je n'arrive pas à comprendre comment l'interface graphique pourrait etre gérée à l'extérieur...
    L'interface graphique est dans sa main-thread le serveur et les différents threads correspondant à chaque client tournent dans le même programme.
    Je ne comprends pas ce qui serait "exterieur" à quoi.

    Pour le reste, postez du code....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est vrai que je ne suis pas très claire. Peut être que ce sera plus simple d'expliquer avec mon 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
    listeClient=[]
     
    def f_thread(clisock):
        loopEnd = True
        t=0
        #On cherche le premier livreur disponible:
        num_livreur=0 
        while restaurant[num_livreur].occupe==True:
    		num_livreur +=1
     
        restaurant[num_livreur].occupe=True
     
     
     
     
        while loopEnd:
            data = clisock.recv(2048)
            if t==0:
    			print data
    			num = data[6]
    			t+=1
            clisock.send(data)
     
     
    	if not data:
    	   clisock.shutdown(0)
               listeClient.remove(clisock)
    	   print "Le client"+num+" a ete livre par le livreur"+str(restaurant[num_livreur].num)
    	   restaurant[num_livreur].occupe=False
    	   loopEnd = False
     
     
     
     
     
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('',8001))
    sock.listen(5)
    while True:
    	clisock, addr = sock.accept()
    	listeClient.append(clisock)
    	print "Un client a passe commande"
    	t = threading.Thread(target=f_thread, args=(clisock,))
    	t.start()
    Il s'agit, pour moi, de la partie serveur.

    Donc, quand un client se connecte, on entre dans la fonction "f_thread", jusqua ce que le client se deconnecte. C'est a dire que pour moi, toutes les modifications apportées sur le client s'effectuent dans cette fonction. Et c'est de cette fonction que j'ai essayé d'appeler une fonction de mon interface et que j'ai eu mon erreur. Je ne vois donc pas comment faire pour lier client et interface si je n'utilise pas l'interface dans f_thread.

    J'espere avoir été claire.. merci de votre aide

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Comme dans votre but de code, la partie GUI n'est pas présente pas facile...
    De toutes façons, l'architecture de votre code devrait ressembler à çà:
    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
    import Tkinter as tk
    from threading import Thread
    import time
     
    def run_server(label):
        def do_update():
            label.configure(text=n)
     
        n = 0
        while True:
            root.after_idle(do_update)   
            n += 1
            time.sleep(0.5)
     
     
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
     
    server = Thread(target=run_server, args=(label,))
    server.daemon = True
    server.start()
     
    tk.Button(root, text='quit', command=root.quit)
     
    root.mainloop()
    On démarre le GUI dans le thread principal, le serveur dans un thread secondaire et les mises à jour se font via un mécanisme où on poste une requête depuis le thread serveur qui s'exécutera dans le contexte du thread principal (GUI).

    Une façon plus conventionnelle est de passer par une Queue (au lieu d'empiler dans la mainloop du GUI) qu'on vide via une tache répétitive:
    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
    import Tkinter as tk
    from threading import Thread
    import time
    import Queue
     
    def run_server(label):
     
        n = 0
        while True:
            f = lambda: label.configure(text=n) 
            cmdQ.put(f)
            n += 1
            time.sleep(0.5)
     
     
    cmdQ = Queue.Queue()
    def check_ui_updates(delay=500):
        while True:
            try:
                cmd = cmdQ.get_nowait()
            except Queue.Empty:
                break
            else:
                cmd()
     
        root.after(delay, check_ui_updates)
     
    root = tk.Tk()
    root.after_idle(check_ui_updates)
     
    label = tk.Label(root)
    label.pack()
     
    server = Thread(target=run_server, args=(label,))
    server.daemon = True
    server.start()
    Tous les GUI imposent cette architecture.
    Les différences sont "comment la mettre en œuvre".


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai fait l'interface dans un fichier à part car avec tous les composants, cela devient vite très long. Voilà le code en question :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    from mtTkinter import*
    class fenetre:
     
        def __init__(self):
     
            self.fen=Tk()
            self.fen.geometry("800x800")
            self.fen.wm_title("Interface restaurant")
            self.see = True
     
     
            #separation de la fenetre en panneaux 
            panneauTot = PanedWindow(self.fen,orient=HORIZONTAL,height=750,width=1000)
            pGauche = PanedWindow(self.fen,orient=VERTICAL,height=750,width=500,bg='white')
            self.pDroite = PanedWindow(self.fen,orient=VERTICAL,height=750,width=400,bg='white')
     
            labelpDroite = Label(self.pDroite,text="Commandes",height=2,width=55,bg='#CAAD73')
            labelpDroite.pack()
     
     
            pGauche1 = PanedWindow(pGauche,orient=VERTICAL,height=400,width=500,bg='#F3DEB6')
            pGauche2 = PanedWindow(pGauche,orient=VERTICAL,height=350,width=500,bg='#F3DEB6')
     
            pGauche1.pack()
            pGauche2.pack()
     
            labelpGauche1 = Label(self.fen,text="Livreurs",height= 2,bg='#CAAD73')
            pGauche1.add(labelpGauche1)
     
     
            labelpGauche2 = Label(self.fen,text="Chiffre d'affaire",height = 2,bg='#CAAD73')
            pGauche2.add(labelpGauche2)
            bouton2 = Button(self.fen, text="Bouton provisoire 2", command=self.testBouton, height=3)
            pGauche2.add(bouton2)
     
            #Ajout des livreurs a droite de l'interface (3 sous forme de checkButton et 2 sous forme de label a nous de choisir ce qui est mieux)
            self.var_livreur1= IntVar()
            self.var_livreur1.set(0)
            self.livreur1 = Checkbutton(self.fen,bg='white', text="Livreur 1",command =self.actionCheckbutton1, variable=self.var_livreur1, height=4)
     
     
            self.var_livreur2= IntVar()
            self.var_livreur2.set(0)
            self.livreur2 = Checkbutton(self.fen,bg='white', text="Livreur 2",command =self.actionCheckbutton2, variable=self.var_livreur2, height=4)
     
            self.var_livreur3= IntVar()
            self.var_livreur3.set(0)
            self.livreur3 = Checkbutton(self.fen,bg='white', text="Livreur 3",command =self.actionCheckbutton3, variable=self.var_livreur3, height=4)
     
            self.livreur4 = Label(self.fen,text="Livreur 4",height = 4,bg='white')
            self.livreur5 = Label(self.fen,text="Livreur 5",height = 3,bg='white')
     
            pGauche1.add(self.livreur1)
            pGauche1.add(self.livreur2)
            pGauche1.add(self.livreur3)
            pGauche1.add(self.livreur4)
            pGauche1.add(self.livreur5)
     
            #Ajout de la liste client a gauche : a relier a la partie reseau (utiliser la liste de client reseau pour remplir la liste)
            #self.liste = Listbox(pDroite)
            sbar = Scrollbar(self.pDroite)
            #sbar.config(command=self.liste.yview)
            #self.liste.config(yscrollcommand=sbar.set)
            sbar.pack(side=RIGHT, fill=Y)
            #for i in range(10):
            #    self.liste.insert(i, "Client-" + str(i))
            #self.liste.pack(side=LEFT, expand=YES, fill=BOTH)
     
     
     
            #pDroite.add(labelpDroite)
            panneauTot.add(pGauche)
            panneauTot.add(self.pDroite)
     
     
            panneauTot.pack()
            #self.fen.mainloop()
            self.fen.update_idletasks()
            self.fen.update()
     
     
        def ajoutClient(self,num,statut):
    		label = Label(self.pDroite, text="CLient "+str(num)+": "+statut, bg="pink")
    		label.pack()		
    		self.fen.update_idletasks()
    		self.fen.update()
     
        def testBouton(self):
            print ("coucou")
     
     
    #Changement d'etat quand on clique sur les checkButton
        def actionCheckbutton1(self):
            if self.var_livreur1.get() == 1:
                self.livreur1.configure(bg='red')
            else :
                self.livreur1.configure(bg='white')
     
        def actionCheckbutton2(self):
            if self.var_livreur2.get() == 1:
                self.livreur2.configure(bg='red')
            else :
                self.livreur2.configure(bg='white')
     
        def actionCheckbutton3(self):
            if self.var_livreur3.get() == 1:
                self.livreur3.configure(bg='red')
            else :
                self.livreur3.configure(bg='white')

    Ensuite, j'importe ce fichier dans celui ou j'ai mon code serveur. Le probleme est que si je reprend votre code de cette façon :
    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
     
    import Tkinter as tk
    from threading import Thread
    import time
    import Interface
     
    def run_server():
    	root.ajoutClient(3,"en attente")
    	while True:
    		root.after_idle(do_update)   
    		time.sleep(0.5)
     
     
    root = Interface.fenetre()
     
    server = Thread(target=run_server)
    server.daemon = True
    server.start()
    Quand j'execute le programme, la fenetre s'affiche et se ferme directement.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    mtTkinter inclue un mécanisme sophistiqué de queuing qui fait que normalement, pas besoin d'en écrire un autre.

    Quand j'execute le programme, la fenetre s'affiche et se ferme directement.
    Si vous n'entrez pas dans la mainloop, çà sort du programme.... et c'est normal.
    Je n'ai pas testé mais ceci devrait fonctionner:
    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
    from threading import Thread
    import time
    import Interface
     
    def run_server():
            for x in range(3):
      	      root.ajoutClient(x,"en attente")
    	      time.sleep(0.5)
     
     
    root = Interface.fenetre()
     
    server = Thread(target=run_server)
    server.daemon = True
    server.start()
     
    root.fen.mainloop()
    Pour résumer, la seule chose que vous avez à faire (avec mtThread) est de démarrer le GUI dans la thread principale et le serveur dans un thread secondaire.
    Si vous avez toujours des problèmes, essayez de le reproduire avec un minimum de code (normalement vous n'avez pas besoin de votre serveur et de ses clients mais juste d'une ou plusieurs threads qui mettent à jour le GUI).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour, je viens de voir votre réponse. J'ai essayé de faire comme vous me l'avez dit mais le probleme c'est que je ne peux pas connecter plusieurs clients en meme temps. J'ai donc fait ça :

    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
     
     
    def run_server(clisock):
     
    	loopEnd = True
    	t=0
    	time=0
    	num_livreur=0 
    	while restaurant[num_livreur].occupe==True:
    		num_livreur +=1
     
    	restaurant[num_livreur].occupe=True 
     
    	while loopEnd:
    		data = clisock.recv(2048)
    		print time
    		print data
    		if t==0:
    			num = data[6]
    			num=len(listeClient)
    			f.ajoutClient(num, "en attente")
    			clisock.send(data)
    			t+=1
    		if not data or time>50000:
    			clisock.send("end")
    			listeClient.remove(clisock)
    			print "Le client"+str(num)+" a ete livre par le livreur"+str(restaurant[num_livreur].num)
    			restaurant[num_livreur].occupe=False
    			loopEnd = False
    		time+=1
     
     
     
     
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('',8001))
    sock.listen(5)
     
    f = Interface.fenetre()
    while True:
     
    	clisock, addr = sock.accept() 
    	server = Thread(target=run_server, args=(clisock,))
    	#server.daemon = True
    	server.start()
    	f.fen.mainloop()

    Mais, meme si je met tout ce qui concerne la fenetre en commentaire, ça ne marche pas...
    Quand je connecte un client la boucle se "bloque", time=1 puis time =2 puis plus rien. Je n'arrive pas à comprendre
    Merci

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f = Interface.fenetre()
    while True:
     
            ...
    	f.fen.mainloop()
    comment/quand çà va pouvoir sortir de la mainloop?

    edit: d'autre part ce qui est dans ce while, c'est le boulot du serveur qui devrait être dans un thread.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je suis désolée je ne vois vraiment pas comment faire ...

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par fgallais Voir le message
    Je suis désolée je ne vois vraiment pas comment faire ...
    Reprenez le dernier code que vous avez posté et commencez par regrouper les instructions qui concernent le "serveur" dans une fonction.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  2. [editeur GUI][info]
    Par lunatix dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 26/01/2004, 15h59
  3. [GUI] Ou trouver les standard ?
    Par Braim dans le forum Windows
    Réponses: 5
    Dernier message: 01/10/2003, 08h13
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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