[python] odzielny wątek, pygtk

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
makson
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1542
Rejestracja: 23 mar 2009, 07:10
Płeć: Mężczyzna
Wersja Ubuntu: 16.04
Środowisko graficzne: Xfce
Architektura: x86_64

[python] odzielny wątek, pygtk

Post autor: makson »

Zrobiłem aplikację w Pythonie i przy pomocy Glade przygotowałem dla niej prosty interfejs graficzny. Naciśnięcie przycisku 'Start' wywołuje funkcję wyglądającą mniej-więcej tak (duże uproszczenie, ale oddaje ideę):

Kod: Zaznacz cały

 def button_start(self, widget):
  global lista
  while lista != []:
   wynik = funkcja.licząca(lista[0])
   del lista[0]
  self.logwindow1.set_text(wynik)
Problem jest w tym, że liczenie w pętli 'while' zajmuje dużo czasu. Podczas tego liczenia program jest zamrożony i nic się nie dzieje i nic nie można zrobić. Chciałbym zrobić, żeby po kliknięciu przycisku 'Start' program liczył swoją drogą, a reszta aplikacji działała normalnie. Chciałbym też, żeby podczas liczenia co np. 1 sekundę w 'logwindow1' pokazywał tekst 'wynik' dopóki nie skończy liczyć i wtedy pokazał ostatni 'wynik'. Proszę o pomoc i chciałbym skorzystać z jakiegoś megaprostego i szybkiego w realizacji sposobu na zrobienie tego.
Pozdrawiam.
Miałem Linuksa, zanim stało się to modne.
Awatar użytkownika
warlock24
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 102
Rejestracja: 20 cze 2008, 22:35
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [python] odzielny wątek, pygtk

Post autor: warlock24 »

być może to się nada

Timer - wątek wykonujący kod po czasie x sekund

Kod: Zaznacz cały

t = threading.Timer(numSec, funcPtr)
t.start()
t.cancel()
o ile pamiętam z pygtk jest jeszcze taka sprawa że wątki działają mizernie jeżeli na początku kodu nie dasz tego

Kod: Zaznacz cały

gtk.gdk.threads_init();
luki86
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 01 maja 2007, 16:40
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [python] odzielny wątek, pygtk

Post autor: luki86 »

Może da się to na generatorach zrobić, możesz jeszcze spróbować tego sposobu.

Co do logwindow, możesz w nowym wątku uruchomić funkcje tego typu:
while warunek:
rob_cos
time.sleep(1)
Awatar użytkownika
makson
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1542
Rejestracja: 23 mar 2009, 07:10
Płeć: Mężczyzna
Wersja Ubuntu: 16.04
Środowisko graficzne: Xfce
Architektura: x86_64

Odp: [python] odzielny wątek, pygtk

Post autor: makson »

Dzięki za pomoc robię pewne postępy.
Na początku dodałem:

Kod: Zaznacz cały

import gobject, threading
Następnie po kliknięciu przycisku wywołuję funkcję w innym wątku kodem:

Kod: Zaznacz cały

threading.Thread(target=funkcja.licząca, args=(pierwszy_argument, drugi, trzeci)).start()
Linijkę niżej oddzielny wątek do aktualizowania wyników i funkcje aktualizujące:

Kod: Zaznacz cały

  threading.Thread(target=self.pokaz, args=('', )).start()
  print 'aaku'

 def pokaz2(self, nic):
  self.logwindow1
  self.logwindow1.set_text('a')


 def pokaz(self, nic):
  print 'kupaaa'
  a = 0
  while a < 5:
   print 'kupa1bbb'
   gobject.idle_add(self.pokaz2, '')
   a = a + 1
   time.sleep(0.2)
I na końcu koniecznie:

Kod: Zaznacz cały

# wywołanie aplikacji
if __name__ == "__main__":
 gtk.gdk.threads_init()
 hwg = GUI()
 gtk.main() 
(bez gtk.gdk.threads_init() nie działa!)


Teraz pytanie. Jak zrobić, żeby argumentem do funkcji aktualizującej (pokaz) była wartość liczona w funkcja.licząca?
Miałem Linuksa, zanim stało się to modne.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości