Possible Duplicate:
Socket Thread and PyGTK
i want to build a GUI chat application.. I want to create a thread which able to accept the requested connection simultaneously. and show a message box to confirm requested connection to be accepted or rejected. The message box haven’t appearing when the application running , it shows when the application close.. I am really getting confused.
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()
This is the class for crating socket and listening on it…
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
Gtk is not thread safe, it is merely “thread aware” (and essentially “thread incapable” in Windows). Only one thread can access a Gtk object at any time.
In your main program, you first need to call gtk.gdk.threads_init() before you call any other gtk functions. Then, in your thread, any time you want to access any gtk objects, you must first call gtk.gdk.threads_enter() and then after you access them, call gtk.gdk.threads_leave().