Click here to Skip to main content
15,884,598 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
I have created sample application and implemented threading. basically aim to craete this application is i would like to

1. If any process(s) are runnig then User Interface should Notify [DONE]
2. Handle dynamically created thread with ProgressBar [DONE]
3. Provide addition functionality to Start, Pause and Stop thread from available progress list. [NEED YOUR HELP]

Note:-
I don't have much knowledge about Threading and Delegates, so please let me know best solution for existing code.

Files and Controls are used:-
Basically three files are used in this demo application
1. ProgressForm.cs (Window Form)
which conatains Button for creating new progress and Container whic will hold all the created progressbars
2. ProgressClass.cs
Which contains Dynamic Threading and Delegates to Notify UI without locking or hanging user interface
3. ProgressControl.cs (User Control)
Which contains

  • View Screenshot
  • Progressbar (to display process done)
  • Precent Label (display percentage of completed progress)
  • Start/Pause button (for play/pause a thread)
  • Stop button (stop running thread and remove progress from list)
  • StartTime Label (display process started time)
  • EndTime label (display time of process completed)
  • MaxValue Lable (generate random number between 25 to 100)




CODE SNIPPET:-

ProgressForm .cs
C#
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.
            //
        }
    }


ProgressControl.cs

C#
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;
       }
   }

ProgressClass.cs
C#
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);
    }
}


UPDATED:
I am not asking for write whole code instead of provide hint.

I would like to start/pause relevent thread from list, os what should i do for that?

I would like hind in following function:
C#
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.
            //
        }

Thanks,
Imdadhusen
Posted
Updated 11-Sep-11 18:58pm
v6

We're not going to write the code for you. Try to implement it yourself and ask questions if you experience any problems. The best help I can give you right now is the URL for google:

http://www.google.com[^]
 
Share this answer
 
Comments
Sunasara Imdadhusen 9-Sep-11 9:53am    
I am not asking for write whole code instead of provide hint.

I would like to start/pause relevent thread from list, os what should i do for that?

I would like hind in following function:
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.
//
}
 
Share this answer
 
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900