- PR -

VS2005I(VB)でスレッドIDの取得

1
投稿者投稿内容
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2006-03-01 00:12
いつもお世話になります.
VS2003 でJobLogを書き出す処理の際に, スレッドIDを付加して出力していました.
同一Fileに マルチスレッド処理のJobLogを出力するので,識別に用いています.
コードは
Dim id As Integer = System.AppDomain.GetCurrentThreadId
としています.
VB2005に移植したところ,旧式だ,コンパイラに指摘されました.

Dim TID As Integer = System.AppDomain.CurrentDomain.GetCurrentThreadId()
としたところ, 今度は

エラー 2 インスタンスを経由する共有メンバ、定数メンバ、列挙型メンバ、または入れ子にされた型へのアクセスです。正規の式は評価されません。

となります.

APIの GetCurrentThreadId() を使えば,エラーは消えるのですが, IA64等のことを考えると躊躇します.

VS2005でスレッドID(もしくは,相当する代替物) を取得する手立てはないものでしょうか









[ メッセージ編集済み 編集者: ognac 編集日時 2006-03-01 00:13 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-01 00:27
Windows ネイティブのスレッドと、マネージドのスレッドは必ずしも一対一で対応しているとは限りません。
例えばあるネイティブスレッドをマネージドの複数のスレッドが(再)利用するなどのシナリオが考えられます。
そのため、ネイティブのスレッドIDはマネージドからは取得しないようになっています。

ognac さんの用途でしたら、ネイティブのスレッドIDである必然性はないでしょうから、普通に System.Threading.Thread ( .CurrentThread ) の ManagedThreadId プロパティを使えば良いかと思います。
// ちなみに、このマネージドのスレッドIDは、.NET 1.1 までは Thread.GetHashCode で取得していました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-01 01:17
引用:

ognacさんの書き込み (2006-03-01 00:12) より:

Dim TID As Integer = System.AppDomain.CurrentDomain.GetCurrentThreadId()
としたところ, 今度は
エラー 2 インスタンスを経由する共有メンバ、定数メンバ、列挙型メンバ、または入れ子にされた型へのアクセスです。正規の式は評価されません。


では、私はこちらをお答えします。

GetCurrentThreadId メソッドはインスタンス メンバではありません。
System.AppDomain.GetCurrentThreadId() であるハズです。

# 2.0 って賢いなぁ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2006-03-01 12:31
Hongliangさん,じゃんぬねっとさん , 早速のご回答ありがとうございます.
ネイティブのスレッドと、マネージドのスレッドの関係を認識できました.
net2.0 になり,クラスメソッドとインスタンスメソッドの区別が厳格になって,
喜ばしいのですが, Net1/1.1 であやふやにコーディングしてたことに気づき,反省になりました。 Net1.1には戻れないですね。
しんや
会議室デビュー日: 2006/03/23
投稿数: 2
投稿日時: 2006-03-23 18:14
私も今、同じように
AppDomain.GetCurrentThreadId()
の移行で悩んでおります。

私は、メッセージボックスを好きな場所に表示させたく、
SetWindowsHookExに渡すIDに、このメソッドの引数を使用していました。
それで、これに渡すIDはネイティブである必要があると思うのですが、

・「ネイティブのスレッドIDはマネージドからは取得しないようになっています。」
 ということから、2.0では、このメソッド以外には取得する事ができない。

・APIを使用すれば可能だが、これも上記の通り、本来は行ってはいけない。

という事で認識はあっていますでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-23 18:30

ほぼその通りです。
// AppDomain 以外に残されてるかどうか知らないから
が、API 使うときは開き直ってネイティブのスレッドID使うしかないでしょう。
警告を無視して AppDomain のメソッドを使うか、API 関数を使うかはその人次第ですが、AppDomain.GetCurrentThreadId のドキュメントにネイティブの ID を取得できるとは書いていない以上 API 使う方が良いかな。
少なくともそのスレッドがメインスレッドである限り、恐らく問題は発生しないでしょうし。
しんや
会議室デビュー日: 2006/03/23
投稿数: 2
投稿日時: 2006-03-23 19:13
Hongliangさん、ありがとうございました。
APIに渡す引数でもありますし、APIで取得するようにします。
1

スキルアップ/キャリアアップ(JOB@IT)