From 04:00 PM CDT – 08:00 PM CDT (09:00 PM UTC – 01:00 AM UTC) Tuesday, April 16, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.



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