我已经为mopidy核心添加了一个模块,该模块使用gobject.timeout_add()作为重复函数。它在正常运行时工作正常,但是在运行测试时,似乎永远不会调用处理函数。
正在测试的模块有一个方法,可以启动一个大约每半秒发出一次事件的常规进程。测试调用该方法,然后调用time.sleep(2)。来自定时器功能的事件不会发生,并且定时器功能中的某些调试记录也不会发生。其他事件和调试日志记录(在计时器功能之外)工作正常。
我需要做些什么才能让gobject.timeout_add()在鼻子测试中工作?或者我是否需要在测试中使用time.sleep()之外的其他内容以允许其他代码运行?它在测试设置中调用gobject.threads_init(),还有什么我需要做的吗?
答案 0 :(得分:1)
您需要运行an event loop。正如g_timeout_add的文档所解释的那样,该函数(以及glib中的其他类似函数)将create a new timeout source然后附加到事件循环(好吧,GMainContext
,但是你没有真的需要担心这一点)。它不相当于产生一个新线程并让它为你指定的任何时间睡眠超时的持续时间,这似乎是你期望的行为 - 使用主循环允许所有内容发生在一个线程中。