0

スタックサイズが10.000.000に増加した別のスレッドで、再帰関数「hueckel_operator()」を実行しようとしています。まず、エッジ検出ボタンをクリックすると、hueckel_operatorが呼び出されます。だから私はdetect_edges_click()関数で新しいスレッドを作成しました

 private void detect_edges_Click(object sender, EventArgs e)
        {
             var stackSize = 20000000;
             Thread workerThread = new Thread(new ThreadStart(hueckel_operator), stackSize);                          
                workerThread.Start();

        }

public void hueckel_operator(int counter4, int counter5)
{

}

しかし、「エラー22「hueckel_operator」のオーバーロードがデリゲート「System.Threading.ThreadStart」と一致しません」というエラーが発生します。

どのようにして、再帰関数を実行するための新しいスレッドを作成できますか?

新しいスレッドを作成する代わりに、メインスレッドのスタックサイズを増やす方がよいでしょうか?

それとも私は完全にナンセンスな話をしているので、スレッドについてもっと読み続ける必要がありますか?

前もって感謝します

4

4 に答える 4

3

ThreadStartの MSDN を読むと、デリゲートの署名が次のようになっていることがわかります。

public delegate void ThreadStart()

2 つのパラメーターを取るため、メソッドはこれを尊重しません。

パラメータを渡したい場合はParameterizedThreadStartobjectを使用できますが、単一のパラメータを受け入れるようにメソッド シグネチャを変更する必要があります。

public void hueckel_operator(object param)
{
}

int次に、2 つのパラメーターをカスタム タイプにカプセル化できます。

class ThreadParameter
{
     public int I { get; set; }
     public int J { get; set; }
}
于 2012-07-09T16:31:29.107 に答える
2

new ParameterizedThreadStart(hueckel_operator)安全のために使用してからworkerThread.Start();、配列またはリストでパラメーターを渡してもらいたいと思うかもしれません。

于 2012-07-09T16:20:43.103 に答える
0

新しいスレッドを呼び出す方法は、関数でパラメーターを受け取ることを期待していないため、関数を見つけることができないと思います。パラメータを新しいスレッドに渡したい場合は、オブジェクトの配列を使用して、それを関数に渡す必要があります。

于 2012-07-09T16:16:39.910 に答える
0

これは、ThreadStartデリゲートは引数を取らないはずですが、関数hueckel_operatorは 2 つ取るためです。

引数をスレッド関数に渡すには、次のようにラムダ式を使用してスレッド コンストラクターに渡すだけです。

public static void parametrized(int one, int two)
{
    //perform computation
}

次に、ラムダ式でラップされた Thread コンストラクターに渡します。

int arg1 = 4;
int arg2 = 2;
Thread t = new Thread(new ThreadStart(() => parametrized(arg1, arg2)));

この式() => parametrized(arg1, arg2)は、引数をとらない無名関数を作成し (Thread が期待しているように)、提供された引数を使用して、実際に呼び出したい関数を本体から呼び出します。

于 2012-07-09T16:30:56.667 に答える