Динамическая резьба с началом, паузой и остановкой обработки событий

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

  1. был бы, если какие-либо процессы (ы) runnig, то пользовательский интерфейс должен уведомить [ Сделано ]
  2. Ручка динамически созданная резьба с помощью ProgressBar [, сделанная ]
  3. Укажите функциональность добавления для запуска, паузы и остановки резьбы из Доступный список прогресс. [ Нужна ваша помощь ]

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

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

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

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

  3. ProgressControl.cs (пользовательский контроль)
  4. , который содержит
  5. ProgressBar (для отображения выполнения процесса)
  6. Prentent Процент завершенного прогресса)
  7. Кнопка «Пуск / пауза» (для PLAY / PAUSE TOTE)
  8. Кнопка «Остановить» (прекратить текущую резьбу и удалить прогресс из списка)
  9. MATENTTE STARTTE (Дисплей запускается время)
  10. Метка (время отображения процесса Завершено)
  11. MaxValue Lable (генерируйте случайное число от 25 до 100)

фрагмент кода: - 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

5
задан imdadhusen 12 September 2011 в 04:50
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: