andycruce Ответов: 4

Обновление метки во время работы


Я создаю простое приложение в реальном времени для тестирования GPS-модуля с помощью WinForms. Я хотел бы постоянно отправлять текущие данные с GPS на этикетку или текстовое поле для проверки производительности. Я попробовал простую программу, чтобы проверить, как это сделать, показанную ниже:

    public partial class Form1 : Form
    {
        public Form1()
        {
            int i;
            string s;
            InitializeComponent();
            for (i=0; i<20; i++)
            {
                s = String.Format("Curent value of i {0}", i);
                //                FirstLabel.Text = "This is a test";
                FirstLabel.Text = s;
                FirstLabel.Refresh();

                TextBox.Text = s;
                TextBox.Refresh();
                
                
                Thread.Sleep(1000);
             
            }
//            FirstLabel.Text = "This is a test";
//            Thread.Sleep(1000);
//            FirstLabel.Text = "Hello World";
        }


Когда я делаю это, экран winform появляется только после завершения цикла с отображением последней строки i=19. Я хочу, чтобы winform отображалась непрерывно, а содержимое ящиков увеличивалось от 0 до 19 раз в секунду. Я просмотрел много постов и подумал, что TextBox. Refresh(); был бы трюком, но, очевидно, нет. Должно быть, все очень просто, но я не могу понять, что делать. Любая помощь будет очень признательна.

Что я уже пробовал:

То, что я попробовал, описано выше.

4 Ответов

Рейтинг:
2

Midi_Mick

Для такого рода вещей, возможно, еще одна нить-это перебор. Посмотрите на добавление таймера в форму, который срабатывает с интервалом в 1 секунду. Таким образом, вы все еще находитесь в потоке пользовательского интерфейса, когда он активирован, поэтому вам не нужно маршалировать настройку текста метки, и вам не нужно делать никаких вызовов сна, чтобы задержать продолжение, так как вызов выполняется только в выбранном интервале.


Рейтинг:
1

Dave Kreskowiak

Это происходит потому, что ваш код забивает поток пользовательского интерфейса (запуска). Пока поток пользовательского интерфейса занят выполнением вашего кода, он не может обработать насос сообщений приложения и не может перекрасить что-либо, включая вашу метку.

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

Что-то вроде этот[^].


Рейтинг:
1

andycruce

Я нашел еще одно решение в интернете и размещаю его здесь на случай, если кому-то будет интересно. Я создал ярлык на WinForm и назвал его LabelBox. Следующий код работал для вывода числа, когда оно менялось между спящими.

amespace First_WinFormsTest
{

    public partial class Form1 : Form

    {
        public Form1()
        {
            InitializeComponent();
            Thread t = new Thread(new ThreadStart(ChangeLabel));
            t.Start();
        }
        private void ChangeLabel()
        {
            for (int i=0; i<20; i++)
            {
                SetLabelText(i);
                Thread.Sleep(1000);

            }
        }
        private delegate void SetLabelTextDelegate(int number);
        private void SetLabelText( int number)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new SetLabelTextDelegate(SetLabelText), new object[] { number});
                return;
            }
            LabelBox.Text = number.ToString();
        }
    }
}


Philippe Mori

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

Рейтинг:
0

Karthik_Mahalingam

использовать Приложение.Метод DoEvents (System.Окна.Формы)[^]

 TextBox.Text = s;
Application.DoEvents();