- - PR -
VS2005I(VB)でスレッドIDの取得
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2006-03-01 00:27
Windows ネイティブのスレッドと、マネージドのスレッドは必ずしも一対一で対応しているとは限りません。
例えばあるネイティブスレッドをマネージドの複数のスレッドが(再)利用するなどのシナリオが考えられます。 そのため、ネイティブのスレッドIDはマネージドからは取得しないようになっています。 ognac さんの用途でしたら、ネイティブのスレッドIDである必然性はないでしょうから、普通に System.Threading.Thread ( .CurrentThread ) の ManagedThreadId プロパティを使えば良いかと思います。 // ちなみに、このマネージドのスレッドIDは、.NET 1.1 までは Thread.GetHashCode で取得していました。 | ||||
|
投稿日時: 2006-03-01 01:17
では、私はこちらをお答えします。 GetCurrentThreadId メソッドはインスタンス メンバではありません。 System.AppDomain.GetCurrentThreadId() であるハズです。 # 2.0 って賢いなぁ。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-03-01 12:31
Hongliangさん,じゃんぬねっとさん , 早速のご回答ありがとうございます.
ネイティブのスレッドと、マネージドのスレッドの関係を認識できました. net2.0 になり,クラスメソッドとインスタンスメソッドの区別が厳格になって, 喜ばしいのですが, Net1/1.1 であやふやにコーディングしてたことに気づき,反省になりました。 Net1.1には戻れないですね。 | ||||
|
投稿日時: 2006-03-23 18:14
私も今、同じように
AppDomain.GetCurrentThreadId() の移行で悩んでおります。 私は、メッセージボックスを好きな場所に表示させたく、 SetWindowsHookExに渡すIDに、このメソッドの引数を使用していました。 それで、これに渡すIDはネイティブである必要があると思うのですが、 ・「ネイティブのスレッドIDはマネージドからは取得しないようになっています。」 ということから、2.0では、このメソッド以外には取得する事ができない。 ・APIを使用すれば可能だが、これも上記の通り、本来は行ってはいけない。 という事で認識はあっていますでしょうか? | ||||
|
投稿日時: 2006-03-23 18:30
ほぼその通りです。 // AppDomain 以外に残されてるかどうか知らないから が、API 使うときは開き直ってネイティブのスレッドID使うしかないでしょう。 警告を無視して AppDomain のメソッドを使うか、API 関数を使うかはその人次第ですが、AppDomain.GetCurrentThreadId のドキュメントにネイティブの ID を取得できるとは書いていない以上 API 使う方が良いかな。 少なくともそのスレッドがメインスレッドである限り、恐らく問題は発生しないでしょうし。 | ||||
|
投稿日時: 2006-03-23 19:13
Hongliangさん、ありがとうございました。
APIに渡す引数でもありますし、APIで取得するようにします。 |
1