1

나는 파이썬으로 청취하는 소켓으로 응용 프로그램을 만들고 있습니다. 나는 caniical (gi.repository와 glade를 사용하여 gui를 만드는)에 의해 Quickly를 사용했다. 하지만 어쨌든 리스닝 함수에 쓰레드를 만들 수는 없습니다. 나는 스레드 클래스와 threading.Thread 클래스로 여러 방법을 시도했다. 나는 신속하게 쓰레드에 완전히 익숙하다. 인터넷에서 모든 것을 시도했지만 어떤 해결책도 찾을 수 없습니다. 내가 thread.start()를 사용할 때 그것은 gui가 닫힐 때까지 기다린다. 내가 thread.run()을 사용하면 gui에서 빠져 나와 gui가 응답하지 않게하는 함수를 즉시 실행합니다. 다음은 스레드 클래스에 사용 된 샘플 코드입니다. 이 소스 코드는 오픈 소스 프로젝트이기 때문에 필요한 경우 전체 파일을 업로드 할 수 있습니다. 도와주세요.신속하게 파이썬에서 스레딩 (소켓 듣기) 수행

def listen(self): 
    print "working" 
#listen to any incoming connections 
    #self.control_sock_in.listen(1) 
    i=0 
    while True: 
     print "it works" 
    #conn,addr = self.control_sock_in.accept() 
    #data = conn.recv 
    #if there is any incoming connection then check for free slot and reply with that free slot 
#if change of status message then update nodelist 

def on_btn_create_n_clicked(self, widget): 
    self.btn_quit_n.set_sensitive(True) 
    self.btn_join_n.set_sensitive(False) 
    self.btn_create_n.set_sensitive(False) 
    subprocess.check_call(["sudo", "ifconfig", "wlan0", "192.168.0.5", "netmask", "255.255.255.0", "broadcast", "192.168.0.255"]) 
    self.control_sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.control_sock_in.bind(('192.168.0.5', 6000)) 
    self.status_lbl.set_text("Created the network successfully with IP of 192.168.0.5!") 
    self.nodelist['192.168.0.5'] = ('6000','0') 
#start thread on listen() 
    thread.start_new_thread(self.listen,(self,)) 
    self.btn_camera.set_sensitive(True) 
    self.btn_mixer.set_sensitive(True) 
    self.btn_display.set_sensitive(True) 

BTW 주석 처리 된 항목에 누락 된 코드를 제공 할 필요가 없습니다. 나는 그들을 할 수있다. 내가 갇혀있는 문제는 스레딩 문제입니다. 당신이 할 수있는

답변

0

그럼 해결책을 찾았습니다. link from askubuntu 처음 두 줄을 추가해야합니다. from gi.repository import GObject, Gtk GObject.threads_init().

어쨌든 마이클 홀 (Michael Hall)에게 IRC 채널에 큰 감사를드립니다.

1

그 프로그램이 종료되고 실행 일부 비 데몬 스레드가있는 경우 그

from threading import Thread 
listener_thread = Thread(target=self.listen) 
listener_thread.start() 

, 그것은 모두 마무리 그들이 때까지 기다릴 것만큼 쉽지.

스레드를 daemon으로 신고 할 수 있지만주의해야합니다. 자세한 내용은 this article을 참조하십시오. 기본적으로 다른 스레드에서 발생했거나 이미 발생한 정리로 인해 일관된 상태의 데이터를 계속 실행하고 사용할 수 있습니다. 데몬 스레드를 생성

:

from threading import Thread 
listener_thread = Thread(target=self.listen) 
listener_thread.daemon = True 
# or listener_thread.setDaemon(True) for old versions of python 
listener_thread.start() 

최선의 선택은 프로그램이 종료하려고 할 때 어떻게 든 리스너 스레드를 알리도록 리스너가 아닌 데몬 (기본값) 스레드 떠나 방법을 생각하는 것 . 따라서 리스너 스레드는 정상적으로 완료 될 수 있습니다.

스레드의 객체의 run 방법을 사용하지 마십시오

업데이트 - 단순히 당신이 현재에서 호출하는 스레드에서 지정한 함수를 호출합니다.start 메서드를 Thread으로 호출하면 별도의 스레드에서 활동이 시작됩니다.

+0

답변 해 주셔서 감사합니다. 그러나 문제는 여전히 존재합니다. '듣기'기능은 GUI가 닫힐 때만 실행됩니다. 그러나 non-deamon thread와는 달리, 이것은 한참 후에 멈추게됩니다. 그러나 두 스레드가 동시에 실행되기를 원합니다. –

+1

정확히 프로그램이 무엇을 설명해 주시겠습니까? 그것은 나에게 매우 놀랍게 들리지만 작동하지 않습니다. 당신이 제시 한 코드조차도 작동해야합니다.하지만 인바운드 버전 -thread.start_new_thread (ClassName.listen, (self,))에 스레드의 진입 점으로 전달되는 함수를 변경해야한다고 생각합니다. –

+0

당신이 제공 한 코드. 실제로 '빠른'루프 구멍입니다 .gi.builder 개체를 사용하여 gli 파일에서 gui로드합니다 .gi 호출 될 때까지 두 번째 스레드가 시작되지 않습니다. 스레드를 호출해야합니다 및 초기화 할 때 그것은 GUI를로드합니다.하지만 그것은 별도의 클래스이고 거기에서 그것을 호출 할 수 없습니다. –