0

C# 相互運用機能を備えたネイティブ C DLL を使用しています。関数ポインターとしてネイティブ DLL にデリゲートを渡します。ネイティブ DLL が何らかのイベントについて通知する必要がある場合、C# でメソッドが呼び出されます。次に、フォームの TextBox を更新したいと思います。これにより、通常の .NET のみのクロススレッド操作では発生しない予期しない問題が発生します。C DLL のネイティブ スレッドからフォームの TextBox を更新するにはどうすればよいですか?

私は試した:

// Dumb approach
// causes Exception - Cross Thread Operation on GUI - expected
textBox1.Text = "some text"; 

// Invoke approach
// causes Exception (Cross Thread Operation on GUI)
textBox1.Invoke(new AddTextDelegate(AddText), new object[] { text }); 

// SynchronizationContext approach
// causes unhandled win32 exception with no call stack an no way to debug
context.Post(new SendOrPostCallback(delegate { eventHandler(this, args); }), null); 

// My own .NET thead approach
// causes unhandled win32 exception with no call stack an no way to debug
Thread thread = new Thread(new ParameterizedThreadStart(LogMethod));
thread.Start(text); 

.NET スレッドが関係している場合は最初の例外を除いてすべてうまくいきますが、ネイティブ DLL からのスレッドが関係している場合は失敗します。

4

1 に答える 1

1

次のリンクをご覧ください。

http://www.codeproject.com/Articles/16726/Cross-thread-calls-in-native-C

それはあなたが探しているもののように聞こえます。少し長いので最後まで読まなかった。ロックされたキューを使用してリクエストを入れることもできます。次に、キュー内に新しいアイテムがあるかどうかをチェックするタイマーをコード側に配置して、動作させることができます。他のスレッドから大量のデータが送られてくる場合は、時々そうします。インボークにも時間がかかります。GUI スレッドではなくすべての計算を行い、GUI スレッドから GUI の更新のみを行うのが最善です。しかし、あなたはすでにこれらの側面を知っていると思います。

于 2013-03-13T09:00:35.460 に答える