2012-07-02 7 views
6

可能性の重複:
What are the other threads in a default VCL application, and can they be named by purpose?空の新しいVCLフォームアプリケーションでは、どの4つのスレッドが実行されていますか?

新しい空のVCLは、Delphi XE2(32ビット)でのフォームアプリケーション実行しているとき、私はこのアプリのためにタスクマネージャで実行されている4つのスレッドを参照してください。明らかに、どのアプリも少なくとも1つのスレッドを必要としますが、この場合、他の3つのスレッドは何ですか?私は、どのスレッドがどのVCLフォームアプリケーションをデフォルトで実行するかをより深く理解したいと思っています。私はおそらくRAD Studioからデバッグモードで実行していなければならないと考えていたので、EXE自体を起動し、4つのスレッドも実行していました。私はまた、 "リリース"設定(したがって、デバッグ情報のコンパイルを無効にする)でコンパイルしようとしましたが、まだ4つのスレッドがあります。

enter image description here

+3

興味深いことに、Delphi XEではスレッドが1つしかありません。 – kludg

+1

@RobertFrankいいえ、IDEではなく、IDEでコンパイルされたプログラムです。ファイルのタイムスタンプやバックグラウンドでのコンパイルを監視することはありません。 –

+1

ああ、私の悪い。ただ私のコメントを削除し、あなたがあなたの@を私の上にちょうど上に削除するとき、この1つを削除します! :-( – RobertFrank

答えて

8

スレッドのソースを決定するために、あなたはprocess explorerまたはprocess hackerのようなツールを使用して、スレッドの開始アドレスを調べることができます。たとえば、あなたが

  • ntdll.dllの!TpCallbackIndependent + 0xのを見ることができます。この場合

    enter image description here

    ?????これはWindowsスレッドプールAPIの一部です。 0x34? WinAPi関数RtlMoveMemoryへの呼び出しです。

  • Project ??。Exe + 0x ?????アプリケーションのメインスレッド。
+0

また、IDEでデバッガを一時停止し、ビュー "スレッドステータス"を開きます。現在実行中のすべてのスレッドが表示されます。スレッドでダブルクリックすると、呼び出しスタックが表示されます – Lars

+0

@Lars残念ながら、Delphi IDEはスレッドスタック内の呼び出し関数の名前を解決していないようですが、メモリアドレスのみを表示します。 – RRUZ

+0

はい、あなたが正しいです、私はこのコメントを書いたとき、私はDelphiを実行していませんでした。しかし、とにかくあなたのアンカーのために+1 – Lars

5

私のコンピュータでは、アプリケーションのウィンドウがWtsapi32.WTSRegisterSessionNotification APIでセッション変更通知を受け取るように登録されているため、メインスレッド以外のスレッドがすべて作成されます。実装はVcl.Forms - > TApplication.CreateHandleプロシージャ内で見ることができます。ターミナルサービス/リモートデスクトップを介してログオンしたときに、アプリケーションの動作/外観に関係している必要があります。 いくつかの他のスレッドは、他のプログラムが実行可能ファイルにコードをロードしたために存在する可能性があります。

+0

TApplicationがこのセッションを登録する理由は、通知が面白いことです。 – mjn

+1

Screenオブジェクトで使用可能なモニターを再度列挙するために使用されます。 – pani

関連する問題