Переполнение стека. Еще раз, я прихожу к вам в то время, когда вы остро нуждаетесь, неуверенно балансируя на грани безумия. Этот вопрос, как видно из названия, является объединением нескольких других вопросов, которые я видел здесь.
У меня есть приложение PyQt, и я хочу перенаправить потоки stdout и stderr в QTextEdit, который находится в моем графическом интерфейсе без задержки.
Сначала я нашел следующий ответ: qaru.site/info/276685/...
Это работает отлично, но с одной оговоркой: если stdout или stderr обновляются несколько раз, в то время как процессор обрабатывает относительно более длительный метод, все обновления появляются одновременно, когда основной поток возвращается в цикл приложения. К сожалению, у меня есть несколько методов, которые занимают до 20 секунд для завершения (связанные с сетью), и поэтому приложение перестает отвечать на запросы - и QTextEdit не обновляется до тех пор, пока они не будут завершены.
Чтобы устранить эту проблему, я делегировал всю обработку графического интерфейса в основной поток, и я создавал второй поток для обработки более длинных сетевых операций, используя pyqtSignals, чтобы уведомлять основной поток о том, когда работа завершена и возвращает результаты. Сразу же, когда я начал тестировать написанный таким образом код, интерпретатор python начал сбой без предупреждения.
Вот где он сильно размахивает: Python рушится, потому что - используя класс из включенной ссылки выше - я назначил потоки sys.stdout/err в виджет QTextEdit; Виджеты PyQt не могут быть изменены из любого потока, кроме потока приложения, и поскольку обновления для stdout и stderr поступают из созданного мной вторичного рабочего потока, они нарушают это правило. Я прокомментировал раздел кода, в котором я перенаправляю выходные потоки, и, конечно же, программа работает без ошибок.
Это возвращает меня к квадрату и оставляет меня в запутанной ситуации; Предполагая, что я продолжаю обрабатывать связанные с GUI операции в основном потоке и заниматься вычислением и более длительными операциями во вторичном потоке (который я понял, это лучший способ блокировать приложение, когда пользователь вызывает события), как я могу перенаправить Stdout и Stderr из обоих потоков в виджет QTextEdit? Класс в ссылке выше отлично подходит для основного потока, но убивает python - по причине, описанной выше, - когда обновления поступают из второго потока.