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