我已经看过其中一些问题,但尚未找到真正的答案。
我有一个启动gstreamer管道的应用程序,然后监听它发回的数据。
在我的一个示例应用程序中,它以这段代码结束:
gtk.main()
没有gtk窗口,但这段代码确实使它继续运行。没有它,该程序退出。
现在,我已经阅读了使用while True:
的构造,但它们包含sleep
命令,如果我没有弄错,那么会导致我的应用程序在睡眠期间冻结。 ..
有没有更好的方法,不使用gtk.main()?
答案 0 :(得分:3)
gtk.main()
运行事件循环。它不会退出,它不会冻结无所事事,因为它内部的代码类似:
while True:
timeout = timers.earliest() - datetime.now()
try:
message = wait_for_next_gui_message(timeout)
except TimeoutError:
handle_any_expired_timers()
else:
handle_message(message)
wait_for_next_gui_message
函数是不同平台特定函数的包装器,它们等待X11,WindowServer,Windows中未命名的东西等,以传递“用户点击按钮”或“用户点击按钮”等消息。 Q”。
如果您在http.serve_forever()
,twisted
等上致电HTTPServer
或类似内容,它会做同样的事情,除非它是一个wait_for_next_network_message(sources, timeout)
函数,它包装了一些内容例如select.select
,其中sources
是所有套接字的列表。
如果你正在听gstreamer管道,你的sources
就可以成为那个管道,而wait_for_next
功能只是select.select
。
或者,当然,您可以使用twisted
等网络框架。
但是,您不需要 以这种方式设计您的应用。如果您不需要等待多个来源,则可以阻止:
while True:
data = pipe.read()
handle_data(data)
确保管道未设置为非阻塞。如果您不确定,可以在套接字上使用setblocking
,在Unix管道上使用fcntl
,或者在Windows管道上使用我无法记住的东西来确保。
实际上,即使您需要等待多个源,也可以通过将每个源的阻塞循环放入单独的线程(或进程)来实现。这对于数千个套接字不起作用(尽管你可以使用greenlet代替线程),但它适用于3或30个。
答案 1 :(得分:1)
我已成为Cmd课程的粉丝。它为您的程序提供了一个shell提示符,并在等待输入时保持循环。这是link to the docs。它可能会做你想要的。