Делайте потоки (прослушивание сокетов) в Python с помощью Quickly

Я делаю приложение с сокетом прослушивания с Python. Я использовал Quickly по каноническим (которые используют Glade с gi.repository для создания графического интерфейса). Но я все равно не могу создать поток для функции прослушивания. Я пробовал много способов, даже с классом потока и потоком. Класс класса. Я новичок в Quickly и темы полностью. Я попробовал все в Интернете:-), но не могу найти никакого решения. когда я использую thread.start(), он ждет, пока закроется графический интерфейс. Когда я использую thread.run(), он выходит из графического интерфейса и сразу же запускает функцию, которая делает графический интерфейс не реагирующим. Ниже приведен пример кода, который я использовал для класса потока. Я могу загрузить весь файл, если это необходимо, так как это проект с открытым исходным кодом. Пожалуйста, помогите мне.

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)

Кстати, не нужно указывать пропущенный код для комментариев. Я могу сделать их. Я застрял в потоке

2 ответа

Решение

Ну, я нашел решение здесь. ссылка от askubuntu Должны добавить эти две строки в началеfrom gi.repository import GObject, Gtk GObject.threads_init(),

В любом случае огромное спасибо Майкл Холл в IRC канале за то, что указал мне на проблему.

Вы можете сделать это так просто

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

Когда ваша программа завершает работу и работают несколько потоков, не являющихся демонами, она будет ждать, пока все они не завершатся.

Вы можете пометить ваш поток как демон, но вы должны быть осторожны с ним - см. Эту статью для более подробной информации. По сути, они все еще могут работать и использовать данные, которые находятся в согласованном состоянии из-за очистки, которая происходит в других потоках или уже произошла.

Создание потока демона:

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 Объект запускает вашу деятельность в отдельном потоке.

Другие вопросы по тегам