1

我正在 pygtk 中创建一个涉及运行无限循环的应用程序。我认为,循环会干扰 witk gtk.main(),因此应用程序没有响应。实际上,我正在构建一个服务器类型的应用程序,它不断地监听客户端连接。Plzzz 帮助....我是这方面的新手。

这是我最初尝试做的一个示例。(对于那些想要代码的人)

while 1:
  s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.bind(('',2727))
  s.listen(1)
  c,d=s.accept()
  print d
  x=c.recv(1024)

我最终将 gtk.main() 替换为:

while 1:
  s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.bind(('',2727))
  s.listen(1)
  s.accept()
  gtk.main_iteration_do(False)

它会起作用,但 s.accept() 会导致与之前相同的问题....有人可以帮忙吗

4

3 回答 3

2

您可以通过以下方式强制您的应用程序处理挂起的 gtk 事件:

while True:
    #your code 

    while gtk.events_pending():
        gtk.main_iteration()

但是,如果“您的代码”需要一段时间才能执行,您应该考虑在后台进程中实现它。

于 2012-04-08T18:03:29.527 回答
1

您可以使用第二个线程(docs.python.org/library/threading.html)。还有一种方法将 gtk 合并到您的循环中(通过使用 pygtk.org/docs/pygtk/...),但是由于您提到网络,我猜您正在使用阻塞调用,它也会阻塞循环,直到网络上发生某些事情。但是,在您向我们展示一些实际代码之前,我只能猜测。

于 2012-04-08T18:06:29.330 回答
0

即使没有看到任何代码,我也很确定我知道这个问题的去向。pygtk 可能与其他 GUI 框架没有什么不同,因为它的主循环是一个事件循环。应用程序中的所有小部件都将它们的事件注册到此循环中,以便您的应用程序运行。在这些事件驱动的 GUI 框架中,您永远不应该阻塞主线程。主线程中的所有操作都应该相对较快地返回。

当您需要执行将要阻塞或执行大量处理的操作时,应将此功能移至单独的线程。如果您的网络循环将在其自己的事件循环中永远阻塞,则需要这样做。如果是这种情况,您将别无选择,只能使用线程。

我对 pygtk 不是特别熟悉,但是 PyQt/PySide 提供了一个函数,可以让你告诉事件循环进行处理。您可以将其粘贴在您在主线程中执行的循环中,以定期刷新事件。这将是在另一个线程中运行您的进程的替代方法。但同样,只有当你的其他代码没有阻塞,并且只是一遍又一遍地循环。

于 2012-04-08T18:04:02.100 回答