0

さまざまなプロセスやスレッドからデータ(テキスト文字列)を受け取るdllを設定する必要があります。このデータをキューにフィードして一緒にソートするスレッド(すべてのスレッドからの文字列)に入れて、ファイルに保存します。

dllを設定できます。スレッドを設定できます。スレッドをスレッドセーフにすることができます。ファイルとファイルストリームにデータを入れることができます。しかし、疑問は残ります:

•複数のスレッドとプロセスがdll内の同じ単一の共有データセットにテキストを追加するように、おそらく静的なデータセットを設定するにはどうすればよいですか。同じ方法でファイルストリームを設定できますか?どのように?

•個別のプロセスでこの方法で単一のdllを使用できますか?別のプロセスでは、dllで見つかった別のプロセスの静的データを表示できないと思いました。それは可能ですか、それとももっと複雑なことをすることを検討する必要がありますか?

編集: どうもありがとうございました。正確な解決策はないかもしれませんが、あなたのコメントは、私がかつて持っていたいくつかの混乱を解消し、有用な方向に私を向けてくれました。それが私が必要としていたものです。私はこの質問に答えたと思います。

4

3 に答える 3

2

私はあなたの目的を誤解しているかもしれませんが、私が読んでいることに基づいて、プロセスとスレッドがどのように構造化されているかを正確にレビューすることを提案するかもしれません。DLLはプロセスごとの獣であり、関連する各アプリケーションのプロセススペースにライブラリがロードされます。複数のプロセスからデータを収集するライブラリを作成するには、ある種のプロセス間通信メカニズムが必要になります。交差スレッド境界は親プロセス内で管理されるため1つですが、プロセスの境界を越えることは別のことです。Windowsは通常、プロセスが他のプロセスのプロセススペースを無計画に管理できることを望んでいません。おそらく、関心のあるオブジェクトを提供し、複数のプロセスにわたってそれらを管理できる、ある種のアウトプロセスサーバーを想像していますが、それはおそらく無関係な道を進んでいます。繰り返しになりますが、おそらく私は目的を誤解しています。もしそうなら、お詫びします。

于 2012-08-08T20:26:15.683 に答える
1

考えられる解決策の1つは、送信を処理するためにマルチスレッド化するHttpListenerを介してデータを受け入れる単一のプロセスを実行することです。スレッドはイベントをメインスレッドに戻すことができ、メインスレッドは提供されたデータをリストまたは他のデータ構造に追加できます。

スレッドセーフであることを確認するために、データを追加または操作するときにデータ構造をlock()することをお勧めします。

この設定では、別のプロセス(おそらくサービス?)を実行する必要がありますが、要件に基づいて、使用する方法に関係なく、実行する必要があるようです。

于 2012-08-08T20:56:05.423 に答える
0

2)静的vsプロセス:「静的データ」が正確に何を意味するかによって異なります。

DLLの場合、「静的データ」は、モジュール内のどこかに配置され、読み取り専用フラグで保護されたバイトのセットです。DLLをロードする人は誰でも、同じバイトを見ることができます。これは、それらがDLL自体の一部であるためです。もちろん、そのデータはほとんど不変であり、コンパイル/ビルド時に決定されます。これは、たとえば、「リソース」が保持され、アセンブリで使用できる方法です。

C#コードの場合、「静的」データ(フィールド、プロパティ、イベント)は、名前空間とクラスの形式でいくつかの便利な名前でカプセル化された単なるグローバル変数です。それらは完全にグローバルではありません。.NetにはJREのクラスローダーと同様のAppDomainの概念があり、同じプロセスで別々の.Netアプリケーションを実行できます。これらのアプリケーションは、正確に実行されている場合でも、相互にメモリを上書きしません。同じ静的フィールドを持つ同じコード。さらに、静的フィールドを[ThreadLocal]属性でマークして、フィールドを「グローバルにグローバル」ではなく「スレッドごとにグローバル」にすることができます。アプリ内のすべてのスレッドには、独自の「静的」バージョンがあります。田畑。などなど

プロセスについて言えば、頭の中にあると思われる形で「DLLを介して共有および通信する」方法はありません。DLLの共有とは、共通のコードを共有することです。データメモリは「プロセス」の定義によって分離されており、データはもちろんプロセスのメモリに存在します。

システムの下位レベルで言えば、実際には仮想メモリサブシステムのレベルでいくつかの共有があります。コードモジュールが共有されている場合、システムは同じ99個のプロセスが同じDLLファイルを使用していることに気付き、それを1回だけロードすることを決定し、そのファイルの単一ページを複数のプロセスのメモリの同様のページにマップする場合があります。。このように、それは一度ロードされ、複数回使用され、真の共有が発生します。ただし、動的に割り当てられたメモリではなく、コードがロードされて共有されることに注意してください。下位レベルの言語は、その種の共有を「悪用」することができ、実際にコードの読み取り専用保護を解除してコードメモリに書き込むことができたため、同じページを共有するすべてのプロセスにデータが自動的に伝播されましたが、これは現在悪と見なされています:)

メモリマッピングはさておき、それはすべて、DLLを持っていることはコミュニケーションにあまり役立たないことを意味します。

1)スレッドの場合-可能であり、プロセスの場合-方法を知っているように聞こえますが、できません。限目。上記を参照。

さて、あなたの問題を解決するために:それの核心はあなたがプロセス間で通信したいということです。このトピックは、略して「IPC」または「プロセス間通信」と呼ばれます。それを扱う古典的な方法は、初心者のために、次のとおりです。

  • 共有メモリ(同じメモリページをいくつかのプロセスにマッピングします。C#では醜いです)
  • ファイル(9つのプロセスが同じファイルに対して適切な方法で読み取り/書き込みを試みます)
  • ネットワーク/ソケット(tcp、udp ..説明は必要ないと思います)
  • パイプ(2つの側面を持つ特別なファイル:1つはデータの書き込み、もう1つはデータの読み取り、一方は1つのプロセスで使用され、もう一方は2番目のプロセスで使用され、一方向のソケット接続と同じように「チャネル」があります)
  • 共通データベース(プロセスは同じテーブルに書き込み、同じテーブルから読み取る=相互に通信できます)
  • (Web)サービス(ネットワーク/ソケット/パイプ-きれいなWSDLインターフェースとプロキシクラスでカプセル化されています)

等々。それを使用する方法についてほとんど考えていない場合-それは非常に簡単です:たとえば、パイプまたはネットワーク/ソケット接続によって、他の人からすべてのデータを収集する1つの特別なプロセスを準備し、その後、プロセスは単純に典型的な方法。これは、「ブローカー」または「サービス」プロセスです。データを収集して均一に並べ替える必要があるため、このようなプロセスを回避するのはかなり困難です。順序を調整する必要があり、実行するには(ほとんどの)データが手元にある必要があります。それを念頭に置いておくと、サービスプロセスを個別にする必要がないことに気付くかもしれません。(データを生成する)「作業中」のプロセスの1つが、並べ替えジョブも処理する場合があります。必要なのは、データシンクが1つになるように、なんらかの方法でオーケストレーションすることです。そして、誰もがシンクが誰であるかを知っているでしょう。ここで話をやめます。

どういうわけか、シンクが1つしかないのはなぜか、ソートするすべてのデータについてプロセスが完全な知識を持っている必要があるのはなぜか疑問に思い始めた場合、実際には必要ありません。マルチコア/マルチプロセスマシン(または分散プラットフォーム)で使用されるスマートな並べ替えアルゴリズムはかなりあります。これらのアルゴリズムは、部分的に並べ替えを実行し、すべてを接着して、ほぼ瞬時に全体として並べ替えることができます。それらは単純な「一般的なグローバルデータシンクサービス」よりも理解するのが少し難しいですが、一度理解すると、ファイルベースのストレージにそのようなアルゴリズムを書くことは、ソケットやパイプを介してIPCを書くよりも速く/簡単になるかもしれません。

ただし、C#ライブラリを活用することで、Webサービス、.Net Remoting、または共通データベース(sql express?mysql?)を介してIPCを実行することは良いスタートになると思います。多くのプロセスの調整に慣れたら、パイプ、ソケット、memmap、その他のものを後で使用できるようにしておきます。

具体的なコミュニケーションの仕組みを一つ選んで聞いてみると、見つけやすく、説明しやすくなります。

于 2012-08-08T21:00:07.543 に答える