0

次のような for ループで実行されている QThread (ClassA と呼ばれる) から継承されたクラスがあります。

for(int i=0;i<somenumber;i++)
{
    ClassA* classa = new ClassA();

    classa->execute(); // just a normal direct function call

    classa->exit();
    classa->deleteLater();
}

問題は、classa に多くのメモリが含まれており、ループがまだ実行されている間は破棄されていないように見えることです。そのため、メモリが蓄積されるとすぐにプログラムがクラッシュします (メモリ リークなど)。もちろん、プログラムをクラッシュさせる「delete classa」も使用しようとしました。

そのようなクラスをループで適切に実行および削除する方法を誰もが知っているので、メモリを常に占有することはありません。

for ループも別のスレッドにあります。では、deleteLater() を呼び出す際にイベント ループが重要になる可能性があるスレッド階層はありますか? コードは少し複雑すぎて書くことができませんが、私が望む最も迅速な答えは、スレッド環境で Qthread オブジェクトを適切に削除する方法 (つまり、eventloop を適切に使用する方法) であり、メモリ リーク (またはメモリがQthread オブジェクトは削除されません)

4

1 に答える 1

0

を再実装した場合はrun()、いつでもwait()スレッドを終了できます。あなたのメソッドexecute()が を呼び出すと仮定していますstart()。次に、それを直接削除することができます(サンプルコードを使用):

for(int i=0;i<somenumber;i++)
{
    ClassA* classa = new ClassA();

    classa->execute(); // just a normal direct function call

    classa->exit();
    classa->wait(); // wait till the QThread is finished
    delete classa; // immediately free resources
}
于 2014-09-01T14:40:35.010 に答える