2012-03-14 61 views
1

我有以下代碼應該通過TCP/IP發送一系列值,每個值以某種方式修改變量'x','y'和'z'。當我收到任何迴應時,我希望代碼顯示'x','y'和'z'的當前值,但它沒有。我試過添加睡眠(),定時器,甚至使用標籤而不是文本框,但沒有。有任何想法嗎?問候顯示不夠快的變量值

for (i = 0; i < cant; i++) 
     { 
      byte[] data = null; 
      aux = (Convert.ToInt32(v[i, 3] + 48, CultureInfo.InvariantCulture)); 

      //update variables' values 
      x = x + Convert.ToInt32(v[i, 0]); 
      y = y + Convert.ToInt32(v[i, 1]); 
      z = z + Convert.ToInt32(v[i, 2]); 

      data = System.BitConverter.GetBytes(aux); 
      NetworkStream stream = client.GetStream(); 

      // String to store the response ASCII representation. 
      String responseData = String.Empty; 

      // Send the message to the connected TcpServer. 
      stream.Write(data, 0, 1); 
      // Buffer to store the response bytes. 
      data = new Byte[256];     
      while (responseData.Length == 0) 
      { 
       // Read the first batch of the TcpServer response bytes. 
       Int32 bytes = stream.Read(data, 0, data.Length); 
       responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 
      } 

      //DISPLAY CURRENT VALUES 
      textBoxX.Text = x.ToString(); 
      textBoxY.Text = y.ToString(); 
      textBoxZ.Text = z.ToString(); 
     } 
+0

這對於Winforms或WPF的工作方式非常重要,在代碼停止運行並重新進入消息循環之前,控件不會重新繪製。假設Winforms,你可以添加textBoxX.Update()來強制繪製。實際上並不是很實際,如果你做得對,那麼它看起來就像人眼中的模糊。如果重要的是要看到所有的值然後使用ListBox來代替。 – 2012-03-14 16:24:20

回答

2

我猜你的文本框/標籤/等沒有被給予機會重繪上面的代碼在應用程序的主界面線程運行。線程忙於做循環,所以它不能處理重繪事件。 Sleep並沒有幫助,因爲它會讓線程進入睡眠狀態,這是執行重繪所需的線程。

要對此進行排序,您需要將上述循環放入其自己的線程中。這將使GUI線程有機會重新繪製控件。您需要使用Invoke方法更新控件,因爲您會遇到交叉線程執行錯誤。

+0

我通過創建一個新的線程委託來完成上述操作,但它在跨線程操作時遇到了問題。您需要在變更變量時調用變量回調。來源這裏:http://stackoverflow.com/questions/10775367/cross-thread-operation-not-valid-control-textbox1-accessed-from-a-thread-othe – bizah 2013-11-05 22:28:46