【问题标题】:problem in pygtk multi-threaded chat application [duplicate]pygtk多线程聊天应用程序中的问题[重复]
【发布时间】:2011-07-28 21:29:33
【问题描述】:

可能重复:
Socket Thread and PyGTK

我想构建一个 GUI 聊天应用程序。我想创建一个能够同时接受请求连接的线程。并显示一个消息框以确认接受或拒绝请求的连接。应用程序运行时消息框没有出现,它显示应用程序关闭时..我真的很困惑。

if __name__ == "__main__":

w=gtk.Window(gtk.WINDOW_TOPLEVEL)
ChatSock=PrivateChatWindowContent.ChatSocket(w)
#This the thread i am calling from main
    t=Thread(target=ChatSock.ListenThread)
#t.setDaemon(1)
t.start()

这是用于创建套接字并监听它的类...

class ChatSocket():

def __init__(self,window):
self.window=window
self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:        
  self.sock.bind(('',30099))
except ValueError,e:
  print e
self.sock.listen(10)
return

def ListenThread(self):
while 1:
#print "while loop"
(self.new_sock,self.client_addr) = self.sock.accept()
            self.new_sock.settimeout(1)

self.CloseDialog = gtk.MessageDialog(self.window,                                                       gtk.DIALOG_DESTROY_WITH_PARENT,                                 gtk.MESSAGE_QUESTION,                                       gtk.BUTTONS_YES_NO,                                     "New chat request from IP: [SomeIP]\nDo you want to accept?")
respons=self.CloseDialog.run()
if respons==gtk.RESPONSE_YES:
    print "connection accepted"
    self.CloseDialog.destroy()
    ChatWindowThread=PrivateChatWindowContent.ChatWindow
            (self.window,[client ip],[client name])

elif respons==gtk.RESPONSE_NO:
    print "connection rejected"
    self.CloseDialog.destroy()
    self.sock.close()
return

【问题讨论】:

  • 如果您可以创建一个您遇到的问题的最小示例,这将有所帮助,最好是一个其他人可以轻松运行并自己观察的单个文件。在制作这个最小示例的过程中,您很有可能自己解决问题:)

标签: python multithreading sockets pygtk


【解决方案1】:

Gtk 不是线程安全的,它只是“线程感知”(在 Windows 中本质上是“线程无能”)。任何时候只有一个线程可以访问 Gtk 对象。

在您的主程序中,您首先需要在调用任何其他 gtk 函数之前调用 gtk.gdk.threads_init()。然后,在你的线程中,任何时候你想访问任何 gtk 对象,你必须首先调用 gtk.gdk.threads_enter(),然后在你访问它们之后,调用 gtk.gdk.threads_leave()。

【讨论】:

  • 谢谢,这解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多