Уведомления

Группа в Telegram: @pythonsu

#1 Май 19, 2008 13:40:57

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

PyGTK, треды и time.sleep

Здрасте.

Кто с 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)

Офлайн

#2 Май 20, 2008 12:26:41

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

PyGTK, треды и time.sleep

Ну, раз сие никому не ведомо,… придётся убирать потоки из программы, делать её подтормаживающей и выводящей страшную надпись “Ждите ответа…”



Офлайн

#3 Май 20, 2008 12:54:24

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK, треды и time.sleep

а пробовал gtk.gdk.threads_init() и gobject.timeout_add(step_time, func)



Офлайн

#4 Май 20, 2008 14:49:00

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

PyGTK, треды и time.sleep

О, 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 это и заработает…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version