1

時々(非常にまれに)TThreadの終了/解放時にViolateにアクセスする短いコードを実行しています。私はこれらのスレッドの多くのインスタンスを実行していますが、問題を引き起こしているのはこのスポットだけのようで、500回程度の呼び出しごとに1回だけ発生します。

TThreadInheritor* Base= new TThreadInheritor(1);
  try {
    Base->Start();
    WaitForSingleObject((HANDLE)Base->Handle, 1000);
    MyBaseId = Base->scanvalue;
  }__finally {
    Base->Terminate();
    Base->Free();
  }

いよいよ投げ込まれています。私の最初の推測では、WaitForSingleObjectが奇妙な方法でタイムアウトし、TerminateとFreeが混乱していましたが、それがどのように発生するかはよくわかりません。TThreadから継承したとき、Terminate/Freeメソッドとは何の関係も変更しませんでした。

ほんの少しのコードの後で、これら2つのメソッドが違反にアクセスする原因が何であるかを知っている人はいますか?

4

2 に答える 2

2

まだ実行中のを解放しないでくださいTThread。基本クラスのTThreadデストラクタは、その点で安全ではありません。それは問題を引き起こす可能性のあるかなり愚かなことをします。TThread解放する前に、常にaが完全に終了していることを確認してください。この方法を使用するか、レポートがWaitFor()表示されるまで待ちます。WaitForSingleObject()WAIT_OBJECT_0

于 2011-10-05T00:12:03.927 に答える
1

まず、を使用しないでくださいBase->Free()delete Base;代わりに使用してください。

さらに重要なことに、オブジェクトを削除する前に、後で呼び出しBase->WaitFor()て、Terminate()実際に終了していることを確認する必要があります。

Base->Terminate();
Base->WaitFor();
delete Base;

そうしないと、スレッドオブジェクト(コード/ RTLがまだ使用している可能性があります)を時期尚早に削除することになり、アクセス違反が発生することがあります。

または、FreeOnTerminateプロパティをtrueに設定して、オブジェクトの待機/削除を完全に忘れることもできます(ただし、64ビットバージョンのC ++ Builderがまだないため、スレッドが多すぎる場合は、仮想メモリが不足することに注意してください)。

于 2011-10-04T23:55:02.127 に答える