Python - blokujące się okno główne

(arekk-99) #1

Witam.
Tworzę sobie z nudów programik do odczytu wielu formatów dokumentów, głównie dla osób niewidomych, bo nie wszystkie programy są dostępne.
Ciągle napotykam problem z blokującym się oknem głównym podczas operacji na plikach, lub podczas wczytywania zawartości z internetu. Myślę, że kod nie jest tu potrzebny, gdyż używam biblioteki wx, więc są tam standardowe funkcje tworzące okna, menu, pola tekstowe itd. Wczytuję tekst wbudowanymi w wx funkcjami do tego przeznaczonymi, jak np SetValue lub write, by dopisać na końcu TextCtrl.
Używam pythona3. Próbowałem również np. pdfy wczytywać w wątku, za pomocą
t = Thread(self.pdfText(self.queue))
t.start()
I mimo wszystko, po zwróceniu zawartości zmiennej do kolejki i pozyskaniu zawartości z kolejki na końcu głównej funkcji, która sprawdza rozszerzenia plików i wyciąga tekst osobnymi funkcjami tak, jak na przykładzie powyżej, okno główne aplikacji ciągle mi się blokuje.
Proszę o pomoc i pozdrawiam.

(Fizyda) #2

Nie tylko wczytywanie plików musisz zrobić w osobnym wątki, ale i też ich analizowanie plus czytanie. Generalnie widzę tu co najmniej 3 wątki:

  1. wątek główny aplikacji
  2. wątek z GUI
  3. wątek do logiki biznesowej - wczytywanie i analizowanie plików

Pierwszy zrobi Ci się tak naprawdę z automatu i będzie służył do zarządzania dwoma pozostałymi wątkami. Czyli tak naprawdę Ty musisz utworzyć dwa dodatkowe wątki w swojej aplikacji.

(arekk-99) #3

A to nie jest od razu tak, zę wątek główny odpala wx.App, a w następnym wątku podczas otwierania plikóœ otwieram następne wątki?

(arekk-99) #4

Dobra,z robiłem tak, z tym, że teraz mi sięr obi naruszenie ochrony pamięci.
Wczytuję pierwszą część, żeby dało się już słuchać kawałka, następnie kolejne części chcę wczytać za raz, więc wrzycam to w wątek i przelatuję po stronie pętlą for i zbieram z niej tekst. Z tym, że jak już chcę dopisać tekst, to się robi naruszenie ochrony pamięci. Wątek inicjuje tak, jak w pierwszym przykładzie, tylko bez kolejki w tym przypadku, bo dla eksperymentu robię to w tej samej klasie, co zarządzanie interfejsem, tylko innym wątku.

(Fizyda) #5

Nie wiem, nie znam pythona ani tej biblioteki, jestem jednak przekonany, że taka informacja powinna być w dokumentacji.

Ponieważ źle robisz synhronizację danych pomiędzy wątkami. Poczytaj i poucz się na temat projektowania i programowania wielowątkowego bo bez podstaw teoretycznych bardzo ciężko będzie Ci to ruszyć.

(arekk-99) #6

Zrobiłem wx.CallAfter tak, jak jest to zalecane ponoć, z tym, że na Linuksie w tym momencie mi się podczas pracy appki dwa okna tworzą, na Windowsie nie. Ale to już mniejsza, chyba osiągnąłem to, co chciałem.