Отображение значений переменных недостаточно быстро - PullRequest
1 голос
/ 14 марта 2012

У меня есть следующий код, который должен посылать значения серии через TCP / IP, каждое значение каким-то образом изменяет переменные 'x', 'y' и 'z'.Когда я получаю какой-либо ответ, я хочу, чтобы код отображал текущее значение «x», «y» и «z», но это не так.Я попытался добавить Sleep (), Timers и даже использовать Labels вместо textBoxes, но ничего.Есть идеи?С уважением

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

1 Ответ

2 голосов
/ 14 марта 2012

Я предполагаю, что вашему текстовому полю / метке / и т.д. не дают возможности перерисовать, так как приведенный выше код работает в основном потоке графического интерфейса приложения. Поток занят этим циклом for, поэтому он не может обработать события перерисовки. Sleep не помогает, поскольку переводит поток в спящий режим - это поток, необходимый для перерисовки.

Чтобы разобраться с этим, вам нужно поместить вышеуказанный цикл в его собственный поток. Это даст возможность потоку графического интерфейса перерисовать элементы управления. Вам нужно использовать метод Invoke для обновления элементов управления, так как вы получите ошибку выполнения многопоточности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...