I did this by creating a separate thread from the main frame thread to execute code that sends a run update where you can call setProgress in the progress bar, but you must create a delegation method, otherwise you will get an exception that causes your thread to access the element controls in the main thread, thatβs what I would do,
declare a delegate method in your class, if you have a progress bar,
public delegate void SetProgressDelg(int level);
Then implement this method to update the progress bar,
public void SetProgress(int level) { if (this.InvokeRequired) { SetProgressDelg dlg = new SetProgressDelg(this.SetProgress); this.Invoke(dlg, level); return; } progressBar.Value = level; }
hope this works, I use this in several applications and it works great.
This is how you build a progress bar,
ToolStripContainer = toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); // StatusBar // ToolStripStatusLabel StatusBar = new System.Windows.Forms.ToolStripStatusLabel(); StatusBar.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; StatusBar.ForeColor = System.Drawing.Color.Blue; StatusBar.LinkColor = System.Drawing.Color.Navy; StatusBar.Name = "StatusBar"; StatusBar.Size = new System.Drawing.Size(732, 20); StatusBar.Spring = true; StatusBar.Text = "Status Messages Go Here"; StatusBar.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // ProgressBar // ToolStripProgressBar ProgressBar = new System.Windows.Forms.ToolStripProgressBar(); ProgressBar.ForeColor = System.Drawing.Color.Yellow; ProgressBar.Name = "ProgressBar"; ProgressBar.Size = new System.Drawing.Size(150, 19); // // StatusStrip // StatusStrip StatusStrip = new System.Windows.Forms.StatusStrip(); StatusStrip.Dock = System.Windows.Forms.DockStyle.None; StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { StatusBar, this.ProgressBar}); StatusStrip.Location = new System.Drawing.Point(0, 0); StatusStrip.Name = "StatusStrip"; StatusStrip.Size = new System.Drawing.Size(899, 25); StatusStrip.TabIndex = 0; toolStripContainer1.BottomToolStripPanel.Controls.Add(this.StatusStrip);
then you want to add toolStripContainer to the controls of the main panel.
you want to call SetProgress from a thread that processes your task, this is how you start a thread,
//* from your class of your main frame //* this is where SetStatus is defined //* start a thread to process whatever task //* is being done Thread t = new Thread(StartProc); t.Start(); public void StartProc() { //* start processing something, //*let assume your are processing a bunch of files List<string> fileNames; for (int i = 0; i < fileNames.Count; i++) { //* process file here //* ........... //* then update progress bar SetProgress((int)((i + 1) * 100 / fileNames.Length)); } //* thread will exit here }
Let me know if you need anything else, hope this helps,