FONCTION BLOQUANTE PROBLEME

Bonjour, Je reviens encore pour demander votre aide...

J'ai en python sur pcduino une loop qui inclue une fonction bloquante, tant qu'un client n'est pas connecté, il attend... par contre, j'aimerais que cette boucle soit en partie bouclé tant qu'un client n'est pas connecté, je veux tout de meme avoir les Fonction 1 et 2 qui tournent...

def loop()

Fonction 1
...

Fonction 2
...

    print ("Attente nouvelle connexion entrante...")
    clientDistant, ipDistante = serverHTTP.clientAvailable() # attend client entrant
    # code bloque ici tant que pas client ! Si present, on recupere d'un coup objet client ET son ip

...

Je ne sais pas comment m'y prendre...

Auriez vous un conseil a me donner

Merci d'avance

@+

En appelant depuis une boucle principale les fonctions en question (dans l'ordre qui te va), et en redémarrant la boucle du début tant que ton client n'est pas connecté?

Ca peut être aussi simple que de retourner une valeur (un statut) en fonction de l'état de la fonction (exécutée entièrement, partiellement, en attente, etc) et de tester cette valeur dans la boucle principale.

Je ferais ça dans un thread séparé.

Qu'apelles tu un thread ???

arnaudf09: Qu'apelles tu un thread ???

Un thread c'est quand tu programmes en "multitâche"

j'ai essayé de passer la fonction bloquante en une fonction seul mais je n'arrive pas à faire fonctionner celle ci, si un client se connecte...

Je voudrais bien trouvé en python, quelque chose qui ressemble a ca:

    #print ("Attente nouvelle connexion entrante...")
    if clientAvailable():
        Serveur_Web()
    else:
        loop()

mais cela ne marche pas, aurais tu un conseil a me donner pour la faire fonctionner ???

Merci d'avance

@+

voila, je pense avoir fait du multitache, ca fonctionne c'est le principal...

dans le setup:

    timer(1000, toDo) # lance timer pour  2eme fonction loop gerant autre chose que server
    # nb : utiliser timer() plutot que appel direct pour execution loop avant 1er appel loop2
  • Ajout d'une seconde boucle (loop)
#fonction toDo - autorappel par timer dedie
def toDo():
    print(".") # temoin passage loop2

    Serveur_Web() // Gestion du serveur Web avec une fonction bloquante...

    timer(1000, toDo) # auto appel de la fonction toDo

#-- fin toDo

et voila, ca marche

merci a tous pour votre aide

arnaudf09:
Qu’apelles tu un thread ???

Voilà un exemple simple. L’import:

import threading

La fonction à exécuter dans le thread (mise à jour de la date du système à partir d’un serveur NTP):

def updateTime():
    ret = -1
    while ret != 0:
        ret = call(["/usr/bin/ntpdate", "-b", "-s", "-u", "fr.pool.ntp.org"])
        time.sleep(1)

Tu remarqueras que c’est une boucle qui peut être infinie dans le cas où le serveur ne renvoie pas de réponse (ce qui peut arriver si le système n’est pas connecté à Internet).

Malgré tout, ça ne va pas bloquer le reste de l’exécution car cette commande est exécutée dans un thread, de la manière suivante:

c = threading.Thread(None, updateTime, None, (), {})
c.start()

Pour plus de détails, ton moteur de recherche préféré est ton ami.