2011-06-21 40 views
-1

我有兩句話:
來源:約翰
的ConvertTo:傑克C#文本區別

,我想顯示轉換,從「源」的所有文字,同時影響到了「的ConvertTo」字。我已經創建了一個程序來完成這個任務,但是一次只能處理一個字母,以顯示我使用線程的效果,問題是要在同一時間處理所有字母,我想每個字母都需要一個線程,並且每個線程都會調用處理該字母的相同函數,並使用全局變量。

下面是代碼(僅適用於具有相同lenght文本):

private void button1_Click(object sender, EventArgs e) 
    {    
     lblResult.Text = ""; 
     lblResult2.Text = "";    
     ThreadPool.QueueUserWorkItem(new WaitCallback(Process));    
    } 

    int movement = 0; 
    string CumulateText; 
    private void Process(object stateinfo) 
    { 
     int value; 
     int operation; //0->[+] 1->[-] 
     CumulateText = ""; 
     for (int i = 0; i <= textBox1.Text.Length - 1; i++) 
     { 
      if (textBox1.Text[i] != ' ')     
      { 
       value = (char)textBox1.Text[i] - (char)textBox2.Text[i]; 
       if (value >= 0) 
        operation = 1; 
       else 
        operation = 0; 

       for (int ii = 0; ii <= Math.Abs(value); ii++) 
       { 
        if (operation == 1) 
         movement = (char)textBox1.Text[i] - ii; 
        else 
         movement = (char)textBox1.Text[i] + ii; 

        this.Invoke(new EventHandler(ShowMovement)); 
        System.Threading.Thread.Sleep(10); 
       } 
      } 
      CumulateText += textBox2.Text[i].ToString();     
     } 
    } 

    private void ShowMovement(object sender, EventArgs e) 
    {    
     lblResult.Text = CumulateText + Convert.ToString((char)movement);    
    } 

我希望我自己的理解。 請任何建議來完成。 感謝

爲了澄清更多的我想在這裏完成的是一個例子:
來源:約翰
的ConvertTo:傑克

的J - 同Ĵ
Ø - 減少至一(O,N,M ,...,A)
ħ - 減少直到C(H,G,F,...,C)
N - 減少直到K(N,M,L,K)

+0

「我想顯示轉換的所有字母效應‘源’在同一時間到‘的ConvertTo’字」 - 對不起,我無法理解你。請澄清。 – 2011-06-21 17:10:06

+0

這是功課嗎? –

+0

字符串是不可變的,你不能在一個字符串中同時替換多個字母,你必須刪除舊的字符串,並且每次都替換一個新的字符串。如果你想通過魔術般的替換它們來避免這種情況,你應該使用一個Stringbuilder,然後按順序執行它。 – MrFox

回答

0

我曾經爲一個小型的小項目做過類似的工作,這些小項目是爲了娛樂而工作的。

我不明白爲什麼你需要爲每個字母創建一個線程來創建兩個單詞之間的轉換,除非我不理解你假裝正確做什麼。

檢查和研究下面的代碼,看看它的任何幫助:

static class Program 
{ 
    static void Main() 
    { 
     TextTranstition transition = new TextTranstition(); 
     transition.TransitionFinished += TransitionTicked; 
     transition.TransitionTicked += TransitionTicked; 
     transition.StartTransition("AmazingWordTransition", "MyNewWordAppearing", 100); 
     Thread.CurrentThread.Join(); 
     Console.ReadKey(); 
    } 

    public static void TransitionTicked(object sender, TranstitionEventArgs e) 
    { 
     Console.Clear(); 
     Console.Write(e.TransitionText); 
    } 
} 

public class TranstitionEventArgs : EventArgs 
{ 
    private readonly string transitionText; 
    public string TransitionText { get { return this.transitionText; } } 

    public TranstitionEventArgs(string transitionText) 
    { 
     this.transitionText = transitionText; 
    } 
} 


public class TextTranstition 
{ 
    private struct StartInfo 
    { 
     public StartInfo(string initialText, string finalText, int timeStep) 
     { 
      this.initialText = initialText; 
      this.finalText = finalText; 
      this.timeStep = timeStep; 
     } 

     private readonly string initialText; 
     public string InitialText { get { return this.initialText; } } 

     private readonly string finalText; 
     public string FinalText { get { return this.finalText; } } 

     private readonly int timeStep; 
     public int TimeStep { get { return this.timeStep; } } 
    } 

    public EventHandler<TranstitionEventArgs> TransitionFinished; 
    public EventHandler<TranstitionEventArgs> TransitionTicked; 

    public void StartTransition(string initialText, string finalText, int timeStep) 
    { 
     StartInfo startInfo = new StartInfo(initialText, finalText, timeStep); 
     Thread t = new Thread(startTransition); 
     t.Start(startInfo); 
    } 

    private void startTransition(object info) 
    { 
     StartInfo startInfo = (StartInfo)info; 
     string initialText = startInfo.InitialText; 
     string finalText = startInfo.FinalText; 

     if (initialText.Length < finalText.Length) 
     { 
      initialText = initialText.PadRight(finalText.Length); 
     } 

     if (TransitionTicked != null) TransitionTicked(this, new TranstitionEventArgs(initialText)); 

     while ((initialText = transition(initialText, finalText)) != finalText) 
     { 
      Thread.Sleep(startInfo.TimeStep); 
      if (TransitionTicked != null) TransitionTicked(this, new TranstitionEventArgs(initialText)); 
     } 

     if (TransitionFinished != null) TransitionFinished(this, new TranstitionEventArgs(finalText)); 
    } 

    private string transition(string initialText, string finalText) 
    { 
     StringBuilder b = new StringBuilder(finalText.Length); 

     for (int i = 0; i < finalText.Length; i++) 
     { 
      char c = initialText[i]; 
      int charCode = (int)c; 

      if (c != finalText[i]) 
      { 
       if (charCode == 122 || charCode==32) charCode = 65; 
       else if (charCode == 90) charCode = 97; 
       else 
       { 
        charCode += 1; 
       } 
      } 

      b.Append((char)charCode); 
     } 

     return b.ToString(); 
    } 
} 
+0

太棒了,也很複雜,正是我在找的東西,現在我必須瞭解它:]非常感謝 – Somebody

+0

@Somebody:很高興它有用。考慮到目前的實現只適用於「a」到「z」,「A」到「Z」和「'」。您可以修改改變'transition()'中的'char'移位邏輯。 – InBetween

-1

使用BackgroudWorker爲這種東西。

+0

我的主要關注點是創建多個線程(每個字母一個)並調用相同的函數,使字母轉換到「ConvertTo」字中對應的一個字符,並且在這種情況下,它們將使用相同的全局變量。 – Somebody