나는 파이썬으로 청취하는 소켓으로 응용 프로그램을 만들고 있습니다. 나는 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 주석 처리 된 항목에 누락 된 코드를 제공 할 필요가 없습니다. 나는 그들을 할 수있다. 내가 갇혀있는 문제는 스레딩 문제입니다. 당신이 할 수있는
답변 해 주셔서 감사합니다. 그러나 문제는 여전히 존재합니다. '듣기'기능은 GUI가 닫힐 때만 실행됩니다. 그러나 non-deamon thread와는 달리, 이것은 한참 후에 멈추게됩니다. 그러나 두 스레드가 동시에 실행되기를 원합니다. –
정확히 프로그램이 무엇을 설명해 주시겠습니까? 그것은 나에게 매우 놀랍게 들리지만 작동하지 않습니다. 당신이 제시 한 코드조차도 작동해야합니다.하지만 인바운드 버전 -thread.start_new_thread (ClassName.listen, (self,))에 스레드의 진입 점으로 전달되는 함수를 변경해야한다고 생각합니다. –
당신이 제공 한 코드. 실제로 '빠른'루프 구멍입니다 .gi.builder 개체를 사용하여 gli 파일에서 gui로드합니다 .gi 호출 될 때까지 두 번째 스레드가 시작되지 않습니다. 스레드를 호출해야합니다 및 초기화 할 때 그것은 GUI를로드합니다.하지만 그것은 별도의 클래스이고 거기에서 그것을 호출 할 수 없습니다. –