Problems with sockets and threads

Discussion in 'Python' started by Dexter Deejay, Apr 11, 2013.

  1. When i try to run this code and to connect to server (server is written in java that part of code is ok) everything stalls. Thread that i created hereoccupies processor all the time and GUI freezes. It's supposed to be waiting for message from server. (asynchronous one) Is there something that i did wrong here, or is there better way to do this?


    from tkinter import *
    from threading import *
    import time
    import socket
    import sys

    comPort=0
    msg=""
    name=socket.gethostbyname(socket.gethostname())
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    testArea=0
    thread=0

    def threadFunc():
    global sock
    global textArea
    data=""
    while(data==""):
    try:
    data=str((sock.recvfrom(256)),"UTF-8")
    except BlockingIOError:
    print("failed")
    time.sleep(1)
    data=""
    textArea.add((data+"\n"))

    def sendMsg():
    global sock
    message=name+": "+msg.get()+"\n"
    sock.send(bytes(message,"UTF-8"))

    def aboutCommand():
    messagebox.showinfo(title="About",message="This is first (serious) aplication in python.")

    def helpCommand():
    messagebox.showinfo(title="Help",message="BAZINGA!")

    def Connect():
    global sock
    global thread
    sock.connect((serverIPString.get(), 16000))
    sock.send(bytes("#connect request#\n",'UTF-8'))
    data=sock.recvfrom(256)
    reply=str(data[0],"UTF-8")
    answer=(reply.split("#",3))
    if(answer[1]!="connected"):
    messagebox.showinfo(title="Error",message="Connection failed!")
    return
    sock.close();
    sock=None
    comPort=int(answer[2]) #for new connection
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((serverIPString.get(), comPort))
    sock.setblocking(0)
    thread=Thread(target=threadFunc())
    thread.start()

    def Disconnect():
    global sock
    sock.send(bytes("#END#\n","UTF-8"))
    sock.close()

    def ExitApplication():
    Disconnect()
    mGui.destroy()
    return

    mGui=Tk()
    msg=StringVar()
    serverIPString=StringVar()
    mGui.geometry("400x600+200+20")
    mGui.title("Chat client v1.0")

    labServer=Label(mGui,text="Server IP adress: ").pack()
    entServer=Entry(mGui,textvariable=serverIPString).pack()
    btnConnect=Button(mGui,text="Connect",fg="red",bg="blue",command=Connect).pack()
    btnDisconnect=Button(mGui,text="Disconnect",fg="red",bg="blue",command=Disconnect).pack()
    textArea=Text(mGui,bg="yellow").pack()
    entMessage=Entry(mGui,textvariable=msg).pack()
    btnSendMsg=Button(mGui,text="Send message",fg="white",bg="black",command=sendMsg).pack()

    menuBar=Menu(mGui)

    fileMenu=Menu(menuBar,tearoff=0)
    fileMenu.add_command(label="Exit",command=ExitApplication)
    menuBar.add_cascade(label="File",menu=fileMenu)

    optionsMenu=Menu(menuBar,tearoff=0)
    optionsMenu.add_command(label="Change chat name")
    optionsMenu.add_command(label="Connect",command=Connect)
    optionsMenu.add_command(label="Disconnect",command=Disconnect)
    menuBar.add_cascade(label="Options",menu=optionsMenu)

    helpMenu=Menu(menuBar,tearoff=0)
    helpMenu.add_command(label="Help",command=helpCommand)
    helpMenu.add_command(label="About",command=aboutCommand)
    menuBar.add_cascade(label="Info",menu=helpMenu)
    mGui.config(menu=menuBar)
    mGui.mainloop()
     
    Dexter Deejay, Apr 11, 2013
    #1
    1. Advertising

  2. Dexter Deejay

    Wayne Werner Guest

    On Thu, 11 Apr 2013, Dexter Deejay wrote:

    > When i try to run this code and to connect to server (server is written in java that part of code is ok) everything stalls. Thread that i created here occupies processor all the time and GUI freezes. It's supposed to be waiting for message from server. (asynchronous one) Is there something that i did wrong here, or is there better way to do this?
    >
    >
    > from tkinter import *
    > from threading import *


    Everything I've read or used suggests to me that threading+tkinter is a
    dangerous combination.

    Mainly because tkinter already has an event loop, so when you start mixing
    threads things tend to go sideways.

    Instead what you'll want to do is put processing in the .after or
    ..after_idle callbacks - just make sure that whatever is doing is quick (or
    can do a portion of the activity quickly).

    HTH,
    -W
     
    Wayne Werner, Apr 11, 2013
    #2
    1. Advertising

  3. Yeah, that seems to be problem. Waiting for message is in theory infinite. But why doesn't this separate thread leave processor while it is sleeping?
     
    Dexter Deejay, Apr 11, 2013
    #3
  4. Dexter Deejay

    Wayne Werner Guest

    On Thu, 11 Apr 2013, Dexter Deejay wrote:

    > Yeah, that seems to be problem. Waiting for message is in theory infinite. But why doesn't this separate thread leave processor while it is sleeping?


    As far as I've been able to tell? Magic ;)

    But I haven't really dug into it. If you're really doing some waiting
    stuff you might want to look into some other type of message passing
    mechanism, e.g. launch a subprocess to do ths listening and then writing
    to a file and checking that from within Tkinter. I expect there are other
    possibilities that more advanced people may be able to recommend and are
    probably better. But that seems like it would work.

    HTH,
    -W
     
    Wayne Werner, Apr 11, 2013
    #4
  5. Thanks for help. Do you have any reference to pint me out for that subprocess creation?
     
    Dexter Deejay, Apr 11, 2013
    #5
  6. Thanks for help. Do you have any reference to direct me for that subprocess creation?
     
    Dexter Deejay, Apr 11, 2013
    #6
  7. FOUND ERROR! :D In creatin method of thread i wrote treadFunc() and should have said threadFunc (as pointer). Now i have problem with Text component. How to append string at end of it?
     
    Dexter Deejay, Apr 11, 2013
    #7
  8. Dexter Deejay

    Peter Otten Guest

    Dexter Deejay wrote:

    > When i try to run this code and to connect to server (server is written in
    > java that part of code is ok) everything stalls. Thread that i created
    > here occupies processor all the time and GUI freezes. It's supposed to be
    > waiting for message from server. (asynchronous one) Is there something
    > that i did wrong here, or is there better way to do this?


    Fredrik Lundh has an example that shows how to update a Text widget from
    another thread:

    http://effbot.org/zone/tkinter-threads.htm
     
    Peter Otten, Apr 11, 2013
    #8
  9. Thanks! :D
     
    Dexter Deejay, Apr 11, 2013
    #9
  10. Thanks! :D
     
    Dexter Deejay, Apr 11, 2013
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jupiter5F

    Threads and Sockets

    Jupiter5F, Nov 14, 2003, in forum: C++
    Replies:
    4
    Views:
    2,314
    Jupiter5F
    Nov 14, 2003
  2. Julia Goolia

    tkinter, sockets and threads together

    Julia Goolia, Sep 11, 2003, in forum: Python
    Replies:
    4
    Views:
    540
    Steve Holden
    Sep 12, 2003
  3. Gonçalo Rodrigues

    Help needed in problem with Threads and sockets.

    Gonçalo Rodrigues, Dec 29, 2003, in forum: Python
    Replies:
    0
    Views:
    278
    Gonçalo Rodrigues
    Dec 29, 2003
  4. Rod Stephenson
    Replies:
    0
    Views:
    448
    Rod Stephenson
    Jun 22, 2004
  5. Ajay

    threads and sockets

    Ajay, Oct 13, 2004, in forum: Python
    Replies:
    3
    Views:
    298
    Elbert Lev
    Oct 14, 2004
Loading...

Share This Page