0

我已经看到了其中一些问题,但还没有找到真正的答案。

我有一个启动 gstreamer 管道的应用程序,然后监听它发回的数据。

在我基于我的示例应用程序中,它以这段代码结束:

gtk.main()

没有 gtk 窗口,但这段代码确实导致它继续运行。没有它,程序就会退出。

现在,我已经阅读了有关使用while True:的构造,但它们包含sleep命令,如果我没记错的话,这将导致我的应用程序在睡眠期间冻结,所以......

有没有更好的方法,不使用 gtk.main()?

4

2 回答 2

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 中的未命名事物等传递诸如“用户单击您的按钮”或“用户按下 ctrl-Q”之类的消息。

如果你在 a ,等上调用http.serve_forever()或类似的东西,它做的事情完全一样,除了它是一个函数,它包装了类似的东西,你的所有套接字的列表在哪里。twistedHTTPServerwait_for_next_network_message(sources, timeout)select.selectsources

如果你在一个 gstreamer 管道上收听,你sources可以只是那个管道,而wait_for_next函数只是select.select.

或者,当然,您可以使用像twisted.


但是,您不需要以这种方式设计您的应用程序。如果您不需要等待多个来源,则可以阻止:

while True:
    data = pipe.read()
    handle_data(data)

只要确保管道没有设置为非阻塞。如果您不确定,您可以setblocking在套接字、fcntlUnix 管道上使用,或者在 Windows 管道上使用我想不起来的东西来确定。

事实上,即使您需要等待多个来源,您也可以通过将每个来源的阻塞循环放入单独的线程(或进程)中来做到这一点。这不适用于数千个套接字(尽管在这种情况下您可以使用 greenlets 而不是线程),但对于 3 个或 30 个都可以。

于 2013-02-15T22:42:12.807 回答
1

我已经成为 Cmd 类的粉丝。它为您的程序提供一个 shell 提示符,并在等待输入时停留在循环中。这是文档的链接。它可能会做你想做的事。

于 2013-02-15T22:00:40.293 回答