2012-09-17 51 views
1

我需要同時計算文本框中元素的總數和元素的數量。所以我決定創建兩個線程 - 一個用於數字的長度,另一個用於元素的總和。但是當我只啓動一個線程時 - 它的工作是正確的。但是當我開始第二個線程 - 表單開始工作緩慢或停止工作。 創建兩個線程在winforms中遇到麻煩

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())); 
    } 
} 

問題在哪裏?同步?

我已經找到了解決辦法 - 我在while循環對GetLength方法

回答

2

這裏有幾個問題。

  1. 手頭的任務對於(完整)線程來說太小了。線程創建起來很昂貴。
  2. 通過調用主動作,所有工作都在主線程上完成。畢竟,你的解決方案並不是多線程的。
  3. 計數很容易做爲Summing的副產品(反之亦然),所以2個線程/任務是矯枉過正的。
  4. while(true) ...循環會拖累你的流程下來,消耗過多的CPU時間白白

這裏簡單的答案是不使用任何線程,只需要運行一些邏輯textBox1.TextChanged

+0

但除了線程無限循環沒有其他解決方案。或者它不會移動到任何其他形式的操作。 – lapots

+2

是的,沒有線程。如果目標是在TextBox的內容發生更改時更新標籤,則只需TextChanged事件即可。在這種情況下,您的線程方法有太多錯誤需要修復。 –

+0

TextChanged的解決方案有效! – lapots

1

是,這個問題實際上是在同步增加Thread.Sleep(1):有太多了。

你正在產卵的線程只能做Invoke s,這意味着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