2012-02-20 13 views
13

Windowsでスレッドの名前を設定する直感的ではないプロセスがあります(「How to set name to a Win32 Thread?」を参照)。スレッドの名前を取得する方法はありますか?私はこれを可能にするWindows APIは表示されません(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。Win32スレッドの名前を取得するには?

+1

それはどのような方法であなたを助けている場合は、スレッドの開始関数名を取得することができます

HRESULT hr = GetThreadDescription(ThreadHandle, &data); if (SUCCEEDED(hr)) { wprintf(“%ls\m”, data); LocalFree(data); } 

ここにドキュメントがあります。 – Nawaz

+0

@Nawazどうやってやるの? –

+1

@CS:これらのAPIを使用する必要があります。[SymInitialize](http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx) [SymFromAddr](http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx)私はそれらを使用して、このトピックを参照してください:[別のプロセスからWin32スレッドのStartAddressを取得](http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz

答えて

12

スレッド名などは存在しないため、このようなWinAPI呼び出しはありません。

スレッド名を設定すると、IDEのデバッガがそれを保存し、デバッグしやすくなります。 しかし、名前は実際にはWindows API呼び出しによってスレッドにアタッチされることはありません。

デバッガを使用せずにアプリケーションを実行すると、スレッド名を設定しても効果はありません。したがって、名前を取得することはできません。

アクセス可能であれば、デバッガが接続されている場合にのみ動作するコードは作成しません。ハンドルと一緒に自分の名前を保存してください。

+0

デバッガで設定したスレッド名を取得する方法が全くないと言っていますか? スレッド名を使用して正しいスレッドから呼び出されていることを確認するためにコードにデバッグチェックを入れたい – Arthur

+0

スレッド0x66cはコード0(0x0)で終了しました - >私は0x66cが名前 ? – Andre

17

スレッドは実際にはWin32では名前を持っていません。 RaiseException経由のプロセスは、実際にTID =>名前マッピングを格納しているVSデバッガの「シークレットハンドシェイク」に過ぎません。 Windows自体には、スレッド「Name」という概念はありません。