2017-06-30 2 views
0

私は同時に複数のRFIDリーダーを監視する必要があるプロジェクトに取り組んでいます。 RFIDリーダは、それと対話する方法を公開するDLLファイルを有する。 1つの方法は、その接続を開くことです。静的DLLを単一のRFIDリーダーに接続すると、それはうまく動作します。私は私のアプリの複数のインスタンスを実行する場合は、すべての静的DLLを呼び出すと、別のRFIDリーダーに接続します。しかし、私はメインアプリケーションの1つのインスタンスだけを実行し、個々のスレッドを個々のRFIDリーダーに接続させる必要があります。しかし、私がこれを行うと、最初の接続は成功しますが、他のスレッドは共有メモリ空間にあると仮定してDLLを呼び出すことができず、したがって最初のスレッドが関与します。どうすればこの問題を解決できますか?ここ複数のスレッドからRFIDリーダー用静的DLLを呼び出す

は静的変数は、プロセスごとに一意である変数であるThread.Start

public void DoWork() 
    { 

     __parent.UpdateLog(ReaderIP + ": working."); 
     int openresult = 0; 
     int frmcomportindex = 0; 
     int fOpenComIndex; 
     byte fComAdr = Convert.ToByte("FF", 16); // $FF 

     //this line works fine for the first thread adn fails for all following threads 
     // but works fine if I run multiple instances of my app and get each to connect to a single RFID reader 
     openresult = StaticClassReaderB.OpenNetPort(ReaderPort, ReaderIP, ref fComAdr, ref frmcomportindex); 
     fOpenComIndex = frmcomportindex; 
+0

この記事をチェックしてください:https://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(v=vs.110).aspx – Fruchtzwerg

答えて

0

によって呼び出されDoWorkのfucntionあります。静的メソッドは静的変数を使用する可能性が高いため、同じプロセスからの静的メソッドへのすべての呼び出しで同じデータが使用されます。もちろん、プロセスは複数のスレッドで構成できます。プロセス内の各スレッドはすべて同じ静的データのコピーを持ちます。

1つのプロセスから静的DLLを使用する場合は、もちろん問題はありません。

複数のプロセスから静的DLLを使用すると、各プロセスに静的データのコピーが取得されるため、問題はないようです。 (静的メソッドがI/Oハンドルなどのシステムグローバルリソースを共有する場合は、隠された問題がある可能性があることに注意してください)。

複数のスレッドを持つ単一のプロセスから静的DLLを使用すると、静的データのすべてのコピーが共有されるため、スレッドは互いに干渉する可能性があります。

これに対処する最善の方法は、静的ライブラリのドキュメントを読み、その推奨事項に従うことです。ライブラリを複数のスレッドから簡単に使用することはできません。また、複数のプロセスから呼び出すと、気づいていない隠された問題が発生する可能性があります。

関連する問題