Форум сайта python.su
Здрасте.
Кто с PyGTK знаком хорошо, может знаете как там с потоками правильно обращаться?
Вот пример (взят helloworld.py из доки к PyGTK и переделан под нужды вопроса):
import pygtk
pygtk.require('2.0')
import gtk
from threading import Thread
from time import sleep
class HelloWorld:
def hello1(self, widget, data=None):
self.drugoypotok=Thread(target=self.hello2, name=“t1”)
self.drugoypotok.start()
def hello2(self):
print “Hello World”
sleep(0.1)
print “Hello Hello World”
def delete_event(self, widget, event, data=None):
print “delete event occurred”
return False
def destroy(self, widget, data=None):
print “destroy signal occurred”
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect(“delete_event”, self.delete_event)
self.window.connect(“destroy”, self.destroy)
self.window.set_border_width(10)
self.button = gtk.Button(“Hello World”)
self.button.connect(“clicked”, self.hello1, None)
self.window.add(self.button)
self.button.show()
self.window.show()
def main(self):
gtk.main()
if __name__ == “__main__”:
hello = HelloWorld()
hello.main()
Если кнопкой вызывать сразу hello2, то выводятся обе строки, а если так как здесь, в отдельном потоке, то на sleep(0.1) застревает напрочь. Но при закрытии окна вторую строчку всё-таки выводит.
Если бы это проявлялось только в sleep, я бы длинными циклами проц помучал бы и ладно, но такой же эффект проявляется при ожидании данных из сокета, а именно для этого всё и затевалось.
Первоначально прогу сделал под wxPython, всё прекрасно пошло, а сейчас пытаюсь для таблетки Nokia N800 переписать, а там GTK только.
Отредактировано (Май 19, 2008 13:52:35)
Офлайн
Ну, раз сие никому не ведомо,… придётся убирать потоки из программы, делать её подтормаживающей и выводящей страшную надпись “Ждите ответа…”
Офлайн
а пробовал gtk.gdk.threads_init() и gobject.timeout_add(step_time, func)
Офлайн
О, pythonwin, спасибо, то что надо!
Теперь, вроде, разобрался.
Вот так надо переделать внизу программульку примера, чтобы всё заработало:
if __name__ == “__main__”:
gtk.gdk.threads_init()
hello = HelloWorld()
gtk.threads_enter()
hello.main()
gtk.threads_leave()
gobject.timeout_add вроде, имеет другое назначение - запустить функцию через step_time миллисекунд. Но если в это время программа работает, а не тупо ждёт нажатия кнопок, то эта функция у меня не срабатывала. Хотя, может, с gdk.threads_init это и заработает…
Офлайн