2012-09-17 3 views
1

텍스트 상자의 요소 합계와 요소 수를 동시에 계산해야합니다. 그래서 두 개의 스레드를 생성하기로 결정했습니다. 하나는 숫자의 길이이고 다른 하나는 요소의 합입니다. 그러나 하나의 스레드 만 시작하면 올바르게 작동합니다. 그러나 두 번째 스레드를 시작하면 양식이 느리게 작동하거나 전혀 작동하지 않습니다. I는 두 스레드 winforms 문제 threads

thrd = new Thread(GetLength); 
thrd.Start(); 
thrd1 = new Thread(SetSum); 
thrd1.Start(); 

를 만들고 이러한 텍스트 박스에서 숫자 계산 길이와 그 요소의 계산에 대한 합계 스레드 "함수이다.

private void SetSum() 
{ 
    while (true) 
    { 
     if (this.label3.InvokeRequired) 
      this.Invoke(new Action(() => label3.Text = this.GetSum().ToString())); 
    } 
} 

private int GetSum() 
{ 
    string n = textBox1.Text; 
    int sum = 0; 
    for (int i = 0; i < n.Length; i++) 
    { 
      try 
      { 
       sum += int.Parse(n[i].ToString()); 
      } 
      catch (FormatException) { }; 
     } 
     return sum; 
    } 

private void GetLength() 
{ 
    while (true) 
    { 
      if (this.label2.InvokeRequired) 
       this.Invoke(new Action(() => label2.Text = " | Length = " + textBox1.Text.Length.ToString())); 
    } 
} 

어디에서 문제가 발생합니까? 동기화?

나는 해결책을 발견했다 - 나는 GetLength 방법

답변

2

몇 가지 문제가 있습니다.

  1. (전체) 스레드의 작업이 너무 작습니다. 스레드는 생성하는 데 비용이 많이 듭니다.
  2. 기본 동작을 호출하면 모든 작업이 주 스레드에서 수행됩니다. 결국 귀하의 솔루션은 멀티 스레드되지 않습니다.
  3. 카운팅은 Summing의 부산물로 (또는 그 반대로) 쉽게 이루어 지므로 두 스레드/작업이 과도합니다.
  4. while(true) ... 루프는 여기에 간단한 대답은 단지 textBox1.TextChanged 일부 로직을 실행, 어떤 스레드를 사용하지 않는 것입니다 아무것도

너무 많은 CPU 시간을 소모 프로세스를 아래로 드래그합니다.

+0

그러나 무한 루프 용 스레드 외에 다른 솔루션은 없습니다. 또는 양식이있는 다른 작업으로 이동하지 않습니다. – lapots

+2

예가 있습니다 : 스레드가 없습니다. TextBox의 내용이 변경 될 때 레이블을 업데이트하는 것이 목적인 경우 TextChanged 이벤트 만 있으면됩니다. 스레드 접근 방식은이 문맥에서 너무 많은 오류를 수정해야합니다. –

+0

TextChanged를 사용하는 솔루션이 작동합니다! – lapots

1

예, 문제가 사실 동기화에있는 동안 루프에서 Thread.Sleep(1)를 추가 : 그것의 너무 많이가있다.

Invoke을 수행하는 스레드는 UI 스레드가 모든 작업을 수행하고 있음을 의미합니다.

1

코드의이 부분은 Thread.Sleep 또는 기타 대기가없는 무한 루프입니다. 그러면 CPU가 100 %가됩니다. 이것을 이벤트 또는 트리거 할 다른 활동에 연결해야합니다. GetLength

private void GetLength() 
{ 
    while (true) 
    { 
      if (this.label2.InvokeRequired) 
       this.Invoke(new Action(() => label2.Text = " | Length = " + textBox1.Text.Length.ToString())); 
    } 
} 
+0

글 상자에 글을 쓰고 길이를 계산합니다 - 글자를 바꾸는 법을 모르겠습니다 (합계는 같음). – lapots