Как добавить прошедший таймер (мин) в графический интерфейс, во время выполнения индикатора выполнения - PullRequest
0 голосов
/ 05 июня 2019

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

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

namespace Backgrondworker
{
    public partial class Form1 : Form
    {
        int aa = 0;

        public Form1()
        {
            InitializeComponent();         
        }

        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar1.Maximum = 10;
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {          
            for(int i =1;i<=10;i++)
            {
                Thread.Sleep(1000);
                backgroundWorker1.ReportProgress(0);            
            }          
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value += 1;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("completed");

        }
    }
}

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Вы должны сделать следующее

  1. Создать таймер
  2. Запустить таймер при запуске индикатора выполнения
  3. В таймере отметьте галочкой класс timepanи свойство Elapsed, чтобы получить истекшие минуты и показать их в метке.
  4. Остановите таймер, когда индикатор выполнения достигает максимального значения.
0 голосов
/ 06 июня 2019

Объясняю: открытый частичный класс Form1: Form {

    public Form1()
    {
        InitializeComponent();         
    }

    private void button1_Click(object sender, EventArgs e)
    {

        Task.Run(() =>
        {
            for (int i = 1; i <= 10; i++)
            {
                Thread.Sleep(1000);
                label2.Text = i.ToString();
            }
        });

        Task.Run(() =>
        {
            for (int i = 1; i <= 10; i++)
            {
                Thread.Sleep(1000);
                label3.Text = i.ToString();
            }
        });
    } 
}

got: System.InvalidOperationException: «Операция между потоками недопустима: элемент управления« label3 »получен из потока, отличного от потока, которым он был»создан на. '

0 голосов
/ 05 июня 2019

Вы положили 0 в ReportProgress:

backgroundWorker1.ReportProgress(0);

Измените это на:

int percent = (int)Math.Round((i * 100.0) / 10);
backgroundWorker1.ReportProgress(percent);

Деление на 10 дает вам долю выполненной работы (вы подсчитываете 10 раз в цикле), а умножение на 100 предназначено для получения процента.

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