Я обнаружил, что QThread.start()
моего приложения не испускает сигнал started()
как претензия к документации. Я подключил сигнал started()
к слоту, но он никогда не срабатывает, если я явно не вызываю started.emit()
.
Я сократил свой код до работоспособной демонстрации проблемы. Как видите, сигнал на самом деле подключен к слоту, а поток на самом деле запущен start()
, так что ни в том, ни в другом нет проблемы.
Что плохого в том, что started()
никогда не испускается?
#!/usr/bin/env python3
import PySide2.QtCore
import PySide2.QtWidgets
@PySide2.QtCore.Slot()
def test_receiver():
print('thread.started() signal received.')
if __name__ == '__main__':
app = PySide2.QtWidgets.QApplication()
app.processEvents()
thread = PySide2.QtCore.QThread()
thread.started.connect(test_receiver)
thread.start()
# The connection between signal and slot isn't the problem because
# the signal has actually connected, as evidenced if you uncomment the following line:
#
# thread.started.emit()
#
# So why is thread.started() never emitted after thread.start()?
while thread.isRunning():
print('Thread is running...')
PySide2.QtCore.QThread.sleep(1)
print('Everything quit.')
Ваш цикл while
блокирует цикл событий. started
сигнал излучается из другого потока. И в этом случае будет использоваться соединение с очередью, что означает, что основной поток должен перейти, чтобы проверить очередь событий, чтобы обработать вызов слота, но ваш цикл while блокирует его.
@thuga О, боже, это было слишком очевидно. Думаю, сегодня я не думаю. Если вы поставите это как ответ, я отмечу его как принятый.