0

私はマルチスレッドに精通していません。画像文字列を集中的に検索し、整数の2つのリストを出力パラメータとして返すメソッドがあります。

public static void CalcModel(string s, out List<int> startPos, out List<int> len)
    {
        // Do some intensive search
    }

長い文字列の検索には非常に時間がかかります。したがって、文字列をいくつかのフラグメントに分割し、マルチスレッドで検索して、結果を再結合します(それに応じてstartPosを調整します)。

このようなプロセスにマルチスレッドを統合するにはどうすればよいですか?ありがとう

私は次の2つのことを言及するのを忘れました:

  1. 文字列の長さのカットオフを設定し、必要なフラグメントの数をコードに決定させたいと思います。
  2. (元の文字列上の)各フラグメントのstartPosをスレッドに関連付けるのに苦労しました。どうやってやるの?
4

3 に答える 3

0

一般的に、詳細に行き詰まるのではなく、各スレッドに「リターンオブジェクト」を送信します。すべてのスレッドを開始したら、それらをブロックし、すべて終了するまで待ちます。

各スレッドの実行中に、スレッドはその作業オブジェクトを変更し、出力を生成したときに終了します。

だから大まかにこれ(私はあなたがそれをどのように分割したいかを正確に言うことができないので、おそらくこれを変更することができます):

public class WorkItem {
    public string InputString;
    public List<int> startPos;
    public List<int> len;
}

public static void CalcLotsOfStrings(string s, out List<int> startPos, out List<int> len)
{
    WorkItem wi1 = new WorkItem();
    wi1.InputString = s;
    Thread t1 = new Thread(InternalCalcThread1);
    t1.Start(wi1);
    WorkItem wi2 = new WorkItem();
    wi2.InputString = s;
    Thread t2 = new Thread(InternalCalcThread2);
    t2.Start(wi2);

    // You can now wait for the threads to complete or start new threads
    // When you're done, wi1 and wi2 will be filled with the updated data
    // but make sure not to use them until the threads are done!
}


public static void InternalCalcThread1(object item)
{
    WorkItem w = item as WorkItem;
    w.startPos = new List<int>();
    w.len = new List<int>();

    // Do work here - populate the work item data
}


public static void InternalCalcThread2(object item)
{
    // Do work here
}
于 2012-07-24T22:32:57.070 に答える
0

これを試すことはできますが、これらのメソッドのパフォーマンスについてはよくわかりません

Parallel.Invoke(
           () => CalcModel(s,startPos, len), 
           () => CalcModel(s,startPos, len)
               );
于 2012-07-24T22:34:01.267 に答える
0

複数のスレッドを作成して実行するのは非常に簡単な作業です。必要なのは、スレッドの開始点として機能するメソッドだけです。

元の投稿で定義されているCalcModelメソッドがあるとすると、次のことを行うだけで済みます。

// instantiate the thread with a method as starting point
Thread t = new Thread(new ThreadStart(CalcModel));

// run the thread
t.Start();

returnただし、スレッドがいくつかの値を返すようにしたい場合は、ステートメントやoutパラメーターを使用する場合のように値を直接返すことができないため、ちょっとしたトリックを適用することができます。

スレッドを独自のクラスに「ラップ」して、そのデータをクラスのフィールドに格納させることができます。

public class ThreadClass {

    public string FieldA;
    public string FieldB;
    //...

    public static void Run () {

        Thread t = new Thread(new ThreadStart(_run));
        t.Start();
    }

    private void _run() {

        //...
        fieldA = "someData";
        fieldB = "otherData"
        //...
    }
}

これは、アイデアを説明するための非常に大まかな例にすぎません。スレッド同期やスレッド制御の部分は含まれていません。

より難しい作業は、CalcModel並列化できるようにメソッドを分割することを検討することです。次に、部分的な結果を結合して1つのシングルエンドソリューションを形成する方法がより重要になる可能性があります。

于 2012-07-24T22:36:19.293 に答える