2011-06-23 25 views
2

私はWindows XPでDelphiアプリケーションを持っています。このアプリケーションは100スレッドで動作します。場合によっては、スレッドのスタックを完全にドロップしてスレッドを終了する必要があります。スレッドのWindows API安全な終了

私はのTerminateThreadなどのWinAPIのから機能を探しているが、それはsafellyない: Windows Server 2003 and Windows XP/2000: The target thread's initial stack is not freed, causing a resource leak.

+0

私は安全に他の人の車を乗っ取って、車のクラッシュなしですべてが整然とした方法で停止するようにする機能を探しています。誰でも?ブエラー? –

答えて

12

はそのような機能はありません。そのような機能は存在しない可能性があります。 Windowsは、どのスレッドがそのスレッドによって整理されるべきかを知ることができず、その方法を知ることができませんでした。それがあなたのアプリの責任です。

これは間違った方向に進むように私に聞こえます。あなたは、力を使わずに協調的な方法でスレッドを終了させるべきです。それ以外のものは、漏れやその他の重大な問題につながる可能性があります。

+0

Snxをクイック再生します。私は問題を解決する別の方法がありますが、少し難しいです – TheHorse

+1

+1、別の(リモート)プロセス(プロセスのハンドルを使ってExitProcessを実行するスレッドを注入する)を安全に終了する方法はわかっていますが、スレッドを安全に終了する方法。 ExitThreadがありますが、それはそれを呼び出すスレッドを終了させるため、何も使用されません。 –

+4

スレッドを安全に終了させる唯一の方法は、準備ができたらすぐに終了するよう親切に要求することです。 –

1

アプリケーションスレッドがすべてDelphiコードで記述されている場合は、OmniThreadLibraryを使用して、未処理のWin32 APIまたはTThreadの組み込み機能の代わりに、提供されているサービスを使用することを検討してください。

しかし、シグナルスレッドを停止してシャットダウンする場合、特にすべてのスレッドがDelphiのスレッドオブジェクトによって作成され管理されていない場合は、多大な設計が必要になります。適切なソリューションを構築するためにいくつかのWin32プリミティブを一緒に使用します。 Win32イベント・ハンドルを使用して、C/C++で書かれたWin32イベントとシグナル・スレッドを使用します。

純粋な100%デルファイコードベースの場合、私は単にテスト済みのものを使用し、未処理のWin32 APIに行くのではなく、TThread APIまたはOmniThreadLibraryを使用します。

関連する問題