Динамическая многопоточность с обработкой событий Start, Pause и Stop

Я создал образец приложения и реализовал многопоточность. в основном цель создать это приложение я хотел бы

  1. Если какие-либо процессы запущены, то интерфейс пользователя должен уведомить [ DONE ]
  2. Динамически создаваемый поток обрабатывается с помощью ProgressBar [ DONE ]
  3. Предоставляет дополнительные функции для запуска, паузы и остановки потока из доступный список хода выполнения. [ НУЖНА ВАША ПОМОЩЬ ]

Примечание: - У меня мало знаний о Threading и делегатах, поэтому, пожалуйста, дайте мне знать лучшее решение для существующего кода.

Используются файлы и элементы управления: - В основном три файла используются в этом демонстрационном приложении

  1. ProgressForm.cs (форма окна) который содержит кнопку для создания нового прогресса и контейнер, который будет содержать все созданные progressbars

  2. ProgressClass.cs Содержит динамическую многопоточность и делегатов для уведомления пользовательского интерфейса без блокировки или зависания пользовательского интерфейса

  3. ProgressControl.cs (Пользовательский контроль)
  4. Содержит
  5. индикатор хода выполнения (для отображения выполненного процесса)
  6. Precent Label (дисплей)
  7. Кнопка запуска/паузы (для воспроизведения/паузы потока)
  8. Кнопка остановки (остановить выполнение потока и удалить ход выполнения из списка)
  9. StartTime Label (время начала процесса отображения)
  10. EndTime label (время завершения процесса отображения)
  11. MaxValue Lable (генерировать случайное число между 25 и 100)

CODE SNIPPET: - 1. ProgressForm .cs

public partial class ProgressForm : Form
    {
        Random randomMaxValue = new Random();
        public ProgressForm()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
             ProgressClass m_clsProcess;
             ProgressControl progress = new ProgressControl();
             progress.StartedAt = DateTime.Now;
             progress.MinValue = 0;
             progress.CurrentValue = 0;
             progress.MaxValue = randomMaxValue.Next(25, 100);
             AddControl(progress);
             m_clsProcess = new ProgressClass(progress, this, new ProgressClass.NotifyProgress(DelegateProgress));
             m_clsProcess.Start();
        }
        private void DelegateProgress(int CurrentValue, ProgressControl Progress)
        {
            ProgressBar p = (ProgressBar)Progress.Controls.Find("pgbPercent", false)[0];
            p.Minimum = Progress.MinValue;
            p.Value = CurrentValue;
            p.Maximum = Progress.MaxValue;

            Label percent = (Label)Progress.Controls.Find("lblPercent", false)[0];
            percent.Text = string.Format("{0:#00} %", Convert.ToInt16((CurrentValue * 100) / Progress.MaxValue));

            Label start = (Label)Progress.Controls.Find("lblStart", false)[0];
            start.Text = string.Format("{0:HH:mm:ss}", Progress.StartedAt);

            if (CurrentValue == Progress.MaxValue)
            {
                Label complete = (Label)Progress.Controls.Find("lblComplete", false)[0];
                complete.Text = string.Format("{0:HH:mm:ss}", DateTime.Now);
                Progress.Status = ProgressControl.ProgressStatus.Completed;
            }

            Label max = (Label)Progress.Controls.Find("lblMaxValue", false)[0];
            max.Text = string.Format("{0:#00}", Progress.MaxValue);

            Button btnstartstop = (Button)Progress.Controls.Find("btnStartStop", false)[0];
            btnstartstop.Click += new EventHandler(ProgressStartStop);
        }
        private void AddControl(Control ctl)
        {
            tableLayoutPnl.RowCount += 1;
            tableLayoutPnl.RowStyles.Add(new RowStyle());
            ctl.Dock = DockStyle.Fill;
            tableLayoutPnl.Controls.Add(ctl, 0, tableLayoutPnl.RowCount - 1);
        }
        void ProgressStartStop(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //
            //Here i would like to write a code for START / PAUSE thread and update Image acording too.
            //
        }
    }

2. ProgressControl.cs

public partial class ProgressControl : UserControl
    {
        public enum ProgressStatus
        {
            Initialize,
            Running,
            Paused,
            Completed
        }

        public DateTime StartedAt { get; set; }
        public DateTime CompletedAt { get; set; }
        public int MinValue { get; set; }
        public int CurrentValue { get; set; }
        public int MaxValue { get; set; }
        public ProgressStatus Status { get; set; }

        public ProgressControl()
        {
            InitializeComponent();
            this.Status = ProgressStatus.Initialize;
        }
    }

3. ProgressClass.cs

public class ProgressClass
{
    private int ThreadWaitTime = 100;
    private ProgressControl m_progress;
    private NotifyProgress m_clsNotifyDelegate;
    private System.Threading.Thread m_clsThread;

    private System.ComponentModel.ISynchronizeInvoke m_clsSynchronizingObject;
    public delegate void NotifyProgress(int PercentComplete, ProgressControl Progress);

    public ProgressClass(ProgressControl Progress, System.ComponentModel.ISynchronizeInvoke SynchronizingObject, NotifyProgress NotifyDelegate)
    {
        m_progress = Progress;
        m_clsSynchronizingObject = SynchronizingObject;
        m_clsNotifyDelegate = NotifyDelegate;
    }

    public void Start()
    {
        m_clsThread = new System.Threading.Thread(DoProcess);
        m_clsThread.Name = "Background Thread";
        m_clsThread.IsBackground = true;
        m_progress.Status = ProgressControl.ProgressStatus.Running;
        m_clsThread.Start();
    }
    private void DoProcess()
    {
        for (int i = m_progress.MinValue; i <= m_progress.MaxValue; i++)
        {
            NotifyUI(i);
            Thread.Sleep(ThreadWaitTime);
        }
    }
    private void NotifyUI(int Value)
    {
        object[] args = new object[2];
        args[0] = Value;
        args[1] = m_progress;
        m_clsSynchronizingObject.Invoke(m_clsNotifyDelegate, args);
    }
}

Я не прошу написать весь код вместо того, чтобы дать подсказку.

Я хотел бы начать/приостановить соответствующий поток из списка, что я должен сделать для этого? Я хотел бы войти в следующую функцию:

   void ProgressStartStop(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //Here i would like to write a code for START / PAUSE thread and update Image acording too.
        }

ОБНОВЛЕНО:

enter image description here

-121--1943679-

Получить все веб-элементы управления определенного типа на странице Я размышлял о том, как получить все элементы управления на странице, а затем выполнить над ними задачу в этом связанном вопросе: Как искать через C # Dropdownlower

Я размышлял над тем, как получить все элементы управления на странице, а затем выполнить над ними задачу в этом связанном вопросе:

Как искать через C # DropDureList Программно

Мне нужен код, который может сканировать страницу, получать все элементы управления DropDureList и возвращать их в список.

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

31
задан Community 23 May 2017 в 12:17
поделиться