Przekierowanie stdout i stderr do PyQt4 QTextEdit z drugiego wątku

Przepełnienie stosu. Po raz kolejny przychodzę do ciebie w trudnej chwili, balansując niepewnie na krawędziniepoczytalność. To pytanie - co może wynikać z tytułu - jest połączeniem kilku innych pytań, na które widziałem odpowiedź tutaj.

Mam aplikację PyQt i chcę przekierować strumienie stdout i stderr do QTextEdit, który jest w moim GUIbez opóźnienia.

Początkowo znalazłem następującą odpowiedź przepełnienia stosu: https://stackoverflow.com/a/17145093/629404

Działa to doskonale, ale z jednym zastrzeżeniem: jeśli stdout lub stderr są aktualizowane wielokrotnie, podczas gdy procesor przetwarza stosunkowo dłuższą metodę,wszystkie aktualizacje pojawiają się jednocześnie, gdy główny wątek powraca do pętli aplikacji. Niestety, mam kilka metod, które trwają do 20 sekund (związane z siecią), więc aplikacja przestaje odpowiadać - a QTextEdit nie aktualizuje się - dopóki nie zostaną zakończone.

W celu rozwiązania tego problemuPrzekazałem całe przetwarzanie GUI do głównego wątku, a ja tworzyłem drugi wątek do obsługi dłuższych operacji sieciowych, używając pyqtSignals do powiadamiania głównego wątku o zakończeniu pracy i przekazywania wyników. Natychmiast, gdy zacząłem testować napisany w ten sposób kod, interpreter pythona zaczął się zawieszać bez żadnego ostrzeżenia.

Jest to bardzo frustrujące: Python zawiesza się, ponieważ - używając klasy z powyższego linku - przypisałem strumienie sys.stdout / err do widgetu QTextEdit;Widżetów PyQt nie można modyfikować z żadnego wątku innego niż wątek aplikacji, a ponieważ aktualizacje stdout i stderr pochodzą z utworzonego przeze mnie dodatkowego wątku roboczego, naruszają tę regułę. Skomentowałem sekcję kodu, w której przekierowuję strumienie wyjściowe i na pewno program działa bez błędów.

To sprowadza mnie z powrotem do kwadratu i pozostawia mnie w kłopotliwej sytuacji; Zakładając, że kontynuuję obsługę operacji związanych z GUI w głównym wątku i radzę sobie z obliczeniami i dłuższymi operacjami w wątku pomocniczym (co zrozumiałem, to najlepszy sposób, aby aplikacja nie blokowała się, gdy użytkownik uruchamia zdarzenia), jak mogę przekierować Stdout i Stderr z obu wątków do widgetu QTextEdit? Klasa w powyższym linku działa dobrze dla głównego wątku, ale zabija python - z powodów opisanych powyżej - gdy aktualizacje pochodzą z drugiego wątku.

questionAnswers(1)

yourAnswerToTheQuestion