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 コントロールをインスタンス化したスレッド以外から、コントロールのメソッド呼び出しはできません。ただし、
BeginInvoke
、
EndInvoke
、
Invoke
、
InvokeRequired
、
CreateGraphics
メソッドは呼び出せます。これら5つのメソッド以外を呼び出すには、コントロールやフォームの
ISynchronizeInovke
経由で呼び出します。
Invoke
か
BeginInvoke
を使うのがよい方法です。
たとえば
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