2

私はMinecraftのランチャーを書いています(完全なコードはこちら:http://pastie.org/6633420を参照)。これはゲームであることがわかっていますが、プログラミングするのは楽しいことです。

現時点では、すべてのスレッドが必要になる前に閉じているように見えるため、QThreadでのスレッド化に問題があります。エラーが発生しました:QThread: Destroyed while thread is still running。以前のコードで行ったことを実行する以外に、これを修正する方法はありますか?

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

なぜなら、それは本当に悪い習慣であり、うまく機能しないと確信しているからです。それは、ある時点でアプリケーションが応答しなくなる原因になるからです。

4

1 に答える 1

7

これは実際には、QtのPythonバインディングの一種のバグです。QThread関数内でインスタンス化された(MainWidget.update_softwareこの場合は)は、関数が戻ったときにガベージコレクションされます。これにより、実行はQThread: Destroyed while thread is still runningメッセージとともに早期に終了します。

この問題を解決するには、2つのオプションがあります。

  1. 関数内のスレッドを呼び出し.wait()て、関数が戻る前にスレッドが処理を終了できるようにします。ただし、これによりメインスレッドがブロックされますが、これはおそらく必要なものではありません。
  2. すべてのスレッドインスタンスをインスタンス変数またはグローバルのいずれかにして、スレッドの存続期間が含まれているインスタンスまたはプログラムの期間にそれぞれ続くようにします。
于 2013-03-20T00:39:04.093 に答える