- PR -

CLRサポート使用しないプロジェクトでCLRを使用するcppファイル

1
投稿者投稿内容
Forte
会議室デビュー日: 2007/07/24
投稿数: 19
投稿日時: 2007-11-26 11:51
こんにちは。
最近、C++/CLR準拠のコーディングを始めたばかりで、ネイティブC++との違いを目下勉強中です。

開発環境は以下の通りです。
Windows XP SP-2
VisualStudio 2005Pro SP-1
VisualC++ win32コンソールアプリケーション


現在、main関数でイベントを待ち、イベントを受け取ると、win32apiの関数を用いて所定のスレッド関数をサブスレッド上で呼び出すプログラムを開発しています。
元々このプログラムはclrサポートを使用しない、アンマネージソースで書かれたプログラムでした。

ところが最近、.NETの機能を利用するために、とあるクラスAのcppファイルのみ、
プロジェクト設定を"clrサポート使用する"に変更して、マネージソースをコーディングしました。
そしてこのクラスAを、上記のいくつかのスレッド関数内でインスタンス化しています。
ビルドも通り、意図した通りに動いていたので問題無いと思っていたのですが…

ランニングを掛けていてハンドル数が増え続けている事に気付きました。
どうやら、クラスAを呼び出しているスレッド関数のハンドルが残ったままになっているようでした。
スレッド関数はReturnしてスレッドは終了しているのですが、::CloseHandleメソッドを呼んでいるにもかかわらず、ハンドルは解放されていませんでした。

クラスAを呼び出さないスレッド関数ではハンドルは正常に解放されていました。
また、クラスAのヘッダー側に定義が書かれた関数のみを呼び出した場合も、正常に解放されていました。
つまりcpp部に触れなければ起きないようです。



また、試しに作ったTestクラス...
*************TEST.h***************
class TEST
{
public:
TEST();
};
**********************************

************TEST.cpp**************
#include "TEST.h"

TEST::TEST(){}
**********************************

の様な簡単なクラスをスレッド関数内で呼び出すと、、、

TEST.cpp>>プロパティ>>C++>>全般>>clrサポート使用する
という設定の場合は、ハンドルが残る。

TEST.cpp>>プロパティ>>C++>>全般>>clrサポート使用しない
という設定の場合は、ハンドルが残らない。

という結果でした。
つまりクラスAの内部処理は関係無いようです。

"clrサポート使用しない"→"clrサポート使用する"に変えるだけで、ハンドルが解放されないままになるということは、.NETの何かの機能でハンドルを握られたままになる事があるんでしょうか…??

この現象の原因や対処法が有れば教えてください・・・

よろしくお願いします。


[ メッセージ編集済み 編集者: さくさく 編集日時 2007-11-26 19:21 ]

[ メッセージ編集済み 編集者: さくさく 編集日時 2007-11-27 09:11 ]
1

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