2012-07-09 8 views
0

스택 크기가 10.000.000으로 증가 된 다른 스레드에서 재귀 함수 "hueckel_operator()"를 실행하려고합니다. 첫 번째로, 가장자리 감지 버튼을 클릭하면 hueckel_operator가 호출됩니다. 그래서프로세스를 시작할 때 ThreadStateException이 발생합니다

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) 
{ 

} 

로 detect_edges_click() 함수에서 새 스레드를 만든하지만이 같은 오류를 얻을 수

있는 "오류 22 'hueckel_operator'에 대한 과부하가 위임 'System.Threading.ThreadStart'일치" 방법은 내 재귀 함수를 실행하는 새 스레드를 만들 수 있습니까?

새 스레드를 만드는 대신 내 주 스레드의 스택 크기를 늘려야합니까?

아니면 완전히 말도 안되는 얘기인데 스레드에 대해 더 자세히 읽어야합니까?

미리 감사

답변

3

MSDN of ThreadStart 읽기, 우리는 대리인의 서명이 있음을 볼 수 있습니다 : 그것은 두 개의 매개 변수를 사용하기 때문에 당신의 방법을 존중하지 않는

public delegate void ThreadStart() 

.

당신이 ParameterizedThreadStart를 사용할 수있는 매개 변수를 전달하고 싶은,하지만 여전히 하나의 object 매개 변수를 허용하도록 메서드 서명을 변경해야하는 경우 : 당신은 다음, 사용자 정의 유형에 두 int 매개 변수를 캡슐화 할 수

public void hueckel_operator(object param) 
{ 
} 

을 :

class ThreadParameter 
{ 
    public int I { get; set; } 
    public int J { get; set; } 
} 
+0

내가 말했던 것처럼 모든 것을 수행했지만 아무런 오류가 없지만 카운터 4와 카운터 5가 5 씩 증가 할 때마다 hueckel_operator()가 스스로를 호출합니다. 이 경우 어떻게 든 counter4와 counter5를 param에 할당해야합니다. 하지만 어떻게 해야할지 모르겠다. – mctuna

+0

@mrtcn : 두 개의 'int'멤버가있는 사용자 정의 유형을 정의하고 매개 변수를 전달하는 데 사용하는 것이 좋습니다. 예를 들어 답을 편집했습니다. – Tudor

0

에서 나는 당신이 당신의 새로운 스레드를 호출하는 방법은 함수에서 매개 변수를받을 것으로 예상되지 않으며, 따라서이 기능을 찾을 수 있다고 생각합니다. 매개 변수를 새 스레드에 전달하려면 객체 배열을 사용하여 함수에 전달해야합니다.

2

안전을 위해 new ParameterizedThreadStart(hueckel_operator)을 사용하고 workerThread.Start(); 매개 변수를 배열이나 목록에 전달해야 할 수 있습니다.

+0

object param과 같은 의미입니까? '{1,1} 값이있는 배열도 만들었습니다. hueckel_operator (parameterArray)와 같은 매개 변수에 배열을 두어야합니까 ?? – mctuna

+0

@mrtcn 예, paramterArray가 작동합니다.사실, 목록, 사전 및 물론 배열을 포함하여 모든 종류의 IEnumerable이 작동합니다. 심지어 별도의 클래스 또는 구조가 작동합니다. (단 하나의 매개 변수 만 가지고 있다면 배열을 사용하여 그 자체를 전달할 수 있습니다.) –

0

왜냐하면 ThreadStart 대리인은 아무런 인수도 취하지 않지만 함수 hueckel_operator은 2 개를 취하기 때문입니다.

은 단순히 스레드 함수에 인수를 전달 람다 표현식과 같이 사용하여 스레드 생성자에 전달하려면

int arg1 = 4; 
int arg2 = 2; 
Thread t = new Thread(new ThreadStart(() => parametrized(arg1, arg2))); 
: 그런 다음 람다 식에 싸여 스레드 생성자에 전달

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

표현식 () => parametrized(arg1, arg2)은 아무런 인자도 취하지 않는 익명의 함수를 생성하고 (실제로 Thread가 기대하는 것과 같은) 익명의 함수를 만든 다음 제공된 인자로 실제 몸체에서 호출하려는 함수를 호출합니다.