Measurement Studio .NET コントロール に、別のスレッドからアクセスすると例外が発生します。マルチスレッドの .NET プログラムでコントロールにアクセスしようとすると、なぜこの例外が出るのですか。



使用ソフトウェア:
使用ソフトウェア・バージョン: N/A
使用ソフトウェア・バージョンに特化: N/A
二次のソフトウェア: Measurement Studio>>Measurement Studio for Visual Basic 6

問題:
複数のスレッドから Measurement Studio .NET コントロールにアクセスしようとすると、プログラムがしばらくアイドルし、終了した直後に "Object does not match a target type" 例外が出ます。原因は何ですか。また修正する方法はありますか。

解決策:
基本的に Measurement Studio .NET コントロールをインスタンス化したスレッド以外から、コントロールのメソッド呼び出しはできません。ただし、BeginInvokeEndInvokeInvokeInvokeRequiredCreateGraphics メソッドは呼び出せます。これら5つのメソッド以外を呼び出すには、コントロールやフォームの ISynchronizeInovke 経由で呼び出します。InvokeBeginInvoke を使うのがよい方法です。

たとえば ThreadPool コールバック・メソッドでは、Measurement Studio .NET コントロールに直接アクセスしない限り、任意のコードを渡せます。 Threadpool で Measurement Studio .NET コントロールにアクセスするには、フォームの Invoke メソッドから、任意のメソッドを呼び出します。以下に示す例では、MyRealThreadCallback メソッドが、Measurement Studio .NET コントロールに直接アクセスしています。MyRealThreadCallback メソッドは、MyThreadCallback メソッドの中で、Invoke メソッドから呼び出されます。

MethodInvoker は void 引数を取り、void を返すメソッドのデリゲートです。MethodInvoker デリゲートの詳細は、下記のマイクロソフトへのリンクをご参照ください。


private void MyThreadCallback(object s)
{
try
{
// you can have any code here, as long as the code
		does not access a Measurement Studio .NET control 
		directly.
Invoke(new MethodInvoker(MyRealThreadCallback));
}
catch(Exception error)
{
...
}
}



Visual C# のマルチスレッド・プログラミングにおいて、Measurement Studio .NET コントロールや CWUI コントロールへアクセスする例は、下記の NI Developer Zone (英語)をご参照ください。

このルールは、ActiveX を含む Windows のフォームコントロールにのみ適用されます。.NET アプリケーションで ActiveX コントロールを使う場合、実際には AxHost を継承したラッパーを呼び出しています。ラッパーは Windows のフォームなので、このルールが適用されます。別のスレッドから Invoke メソッドを使用して、別のメソッドを呼び出すと、コントロールを生成したメソッドから呼び出すようになります。



private void MyThreadCallback(object s)
{
try
{
Invoke(new MethodInvoker(MyRealThreadCallback));
}
catch(Exception error)
{
...
}
}


関連リンク:
Microsoft .NET Class Framework Library MethodInvoker
(英語)
Developer Zone Example: Accessing a Measurement Studio ActiveX Control and a Native .NET Control in a Multithreaded Program in Visual C#(英語)



添付:





報告日時: 12/19/2002
最終更新日: 10/29/2007
ドキュメントID: 2SID3ESJ