2015-03-15 1 views
0

J'ai ajouté un module à mopidy core qui utilise gobject.timeout_add() pour une fonction répétitive. Cela fonctionne correctement lors de l'exécution normale, cependant lors de l'exécution de tests, il apparaît que la fonction de gestionnaire n'est jamais appelée. Le module testé a une méthode qui démarre un processus normal qui émet des événements à peu près toutes les demi-secondes. Le test appelle la méthode, puis appelle time.sleep (2). Les événements de la fonction de temporisateur ne se produisent pas, et il n'y a pas non plus de débogage dans la fonction de temporisation. D'autres événements et la journalisation de débogage (en dehors de la fonction de minuterie) fonctionnent bien.gobject.timeout_add ne fonctionne pas dans les tests de nez

Que dois-je faire pour que gobject.timeout_add() fonctionne dans les tests de nez? Ou dois-je utiliser autre chose que time.sleep() dans le test pour permettre à l'autre code de s'exécuter? Il appelle gobject.threads_init() dans la configuration de test, y at-il autre chose que je dois faire?

Répondre

1

Vous devez exécuter an event loop. Comme la documentation pour g_timeout_add explique, cette fonction (et d'autres fonctions similaires dans la glib) sera create a new timeout source qui est ensuite attachée à la boucle d'événements (bien, le GMainContext, mais vous n'avez pas vraiment besoin de vous inquiéter à ce sujet). C'est pas l'équivalent de générer un nouveau thread et l'avoir dormi pour tout ce que vous avez spécifié comme la durée du timeout, ce qui semble être le comportement que vous attendez - en utilisant la boucle principale permet tout dans un seul thread .

+0

OK, merci. Ce n'est pas gtk + (le doco que je regardais est [ici]) (http://www.pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--timeout-add), c'est un module backend – teq0

+0

Désolé, je ne voulais pas poster ça, je n'avais pas fini de taper ... Je l'ai d'abord écrit en utilisant un thread dédié, mais quelqu'un a suggéré d'utiliser timeout_add() à la place.J'ai ajouté des trucs pour initialiser la boucle principale, hasn ' Autant que je sache, time.sleep() dort tout le thread principal, ce qui explique pourquoi la fonction timeout n'est jamais appelée Comment les utilisateurs écrivent-ils des tests qui testent les actions effectuées avec timeout_add()? puis-je utiliser pour suspendre l'exécution du test sans arrêter le thread entier? – teq0

+0

time.sleep() bloquera le thread dans lequel il a été appelé. La boucle principale ne génère pas un thread pour faire son stuff dedans-il le fait dans le thread vous l'appelez. Vous devez réellement * exécuter * la boucle principale. Une fois que votre timeout est exécuté, vous pouvez quitter la boucle principale (g_main_loop_quit, ou quel que soit son nom en python) et le contrôle retournera à votre code juste après l'endroit où vous avez appelé g_main_loop_run. – nemequ