2013-03-19 5 views
2

Я пишу ракету для Minecraft (см. Полный код здесь: http://pastie.org/6633420), который, как я знаю, является игрой, но по-прежнему интересно программировать.Как остановить QThread от закрытия?

На данный момент у меня проблемы с потоком с QThread, потому что все потоки, кажется, закрываются, прежде чем они должны. Я получаю сообщение об ошибке: QThread: Destroyed while thread is still running. Есть ли способ, чтобы исправить это, кроме делать то, что я делал раньше в коде, который был

for i in range(1,50): 
    QThread.msleep(200) 
    QCoreApplication.processEvents() 

, потому что я уверен, что это действительно плохая практика и не работает, так как это приводит к тому, приложение не реагирует на некоторые точки.

ответ

6

Это на самом деле своего рода ошибка в привязках Python для Qt. QThread s, созданный внутри функции (MainWidget.update_software, в вашем случае) - это сбор мусора, когда функция возвращается, что приводит к завершению работы с сообщением QThread: Destroyed while thread is still running.

Чтобы решить эту проблему, есть два варианта:

  1. Вызов .wait() на нитку внутри функции, так что нить может завершить обработку до завершения функции. Однако это заблокирует основной поток, что, вероятно, не то, что вы хотите.
  2. Сделайте все экземпляры потоков либо переменными экземпляра, либо глобальными, чтобы время жизни потока продолжалось в течение продолжительности содержащегося экземпляра или программы соответственно.
+0

Большое вам спасибо! Это действительно помогло. На самом деле это было больше, чем я ожидал. – polandeer

+0

** Сделайте все экземпляры потоков либо переменными экземпляра, либо глобальными, чтобы время жизни потока соответствовало длительности содержащегося экземпляра или программы соответственно. ** Просто выделив ответ. +1 –