Changing ProgressBar in a seperate Thread

  • Thread starter =?ISO-8859-15?Q?Martin_P=F6pping?=
  • Start date
?

=?ISO-8859-15?Q?Martin_P=F6pping?=

Hello,

I want to change a ProgressBar in a separate Thread.

My current code is the following:

private void changeProgressBarThread()
{
changeProgressBar();
}

private void changeProgressBar()
{
toolStripProgressBar1.Maximum = 100;
for (int i = 0; i <= 100; i++)
{
toolStripProgressBar1.Value = i;
if (i == 100)
{
for (int j = 100; j >= 0; j++)
{
toolStripProgressBar1.Value = j;
}
i = 0;
}
}
}


private void button1_Click(object sender, EventArgs e)
{

ThreadStart thrdDeleg1 = new ThreadStart(addDataSetThread);
Thread addDSThrd1 = new Thread(thrdDeleg1);

ThreadStart thrdDeleg2 = new ThreadStart(changeProgressBarThread);
Thread addDSThrd2 = new Thread(thrdDeleg2);

addDSThrd1.Start();
addDSThrd2.Start();

while (addDSThrd1.IsAlive)
{
if(!addDSThrd1.IsAlive)
addDSThrd2.Abort();
}
addDSThrd1.Join();

string[] row = new String[3];
row[0] = searchText_;
row[1] = results_.count.ToString();
row[2] = "0";
dgViewData.Rows.Add(row);

}


My problem is now, that I cannot use the toolStripProgressBar1 object:

"Cross-thread operation not valid: Control '' accessed from a thread
other than the thread it was created on."

I understand the error message but... How can I fix the error?
I do not know how to update my progress bar if I cannot update it in my
seperate thread.

How do you do that?


It would be nice if you could give me a small example.


And my other question concerns the following code lines:

while (addDSThrd1.IsAlive)
{
if(!addDSThrd1.IsAlive)
addDSThrd2.Abort();
}


I think these lines of code are not very well/ secure,
because it looks bit like an endless loop.

How do you let another thread (here my progress bar thread) stop if a
long calculation in another thread is finished?



Regards,

Martin
 
S

Sericinus hunter

Try to exploit the following idea. Check if Invoke is required
(this is the only thread-safe property of a control) and if it is,
Invoke a delegate initialized with your changeProgressBar method
instead of calling it directly.

// declare delegate signature
private delegate void ChangeProgressBarCallback();

private void changeProgressBar()
{
if(toolStripProgressBar1.InvokeRequired)
{
// instantiate the callback instance out of this very method
ChangeProgressBarCallback callback = new ChangeProgressBarCallback(changeProgressBar);

// invoke it, when it comes to it again InvokeRequired will be false
Invoke(callback);
}
else
{
toolStripProgressBar1.Maximum = 100;
for (int i = 0; i <= 100; i++)
{
toolStripProgressBar1.Value = i;
if (i == 100)
{
for (int j = 100; j >= 0; j++)
{
toolStripProgressBar1.Value = j;
}
i = 0;
}
}
}
}
 
?

=?ISO-8859-15?Q?Martin_P=F6pping?=

Thanks for your answer!

Sericinus said:
Try to exploit the following idea. Check if Invoke is required
(this is the only thread-safe property of a control) and if it is,
Invoke a delegate initialized with your changeProgressBar method
instead of calling it directly.
[...]
if(toolStripProgressBar1.InvokeRequired)

The ToolStripProgressBar does not has a property "InvokeRequired" :-(
 
S

Sericinus hunter

Ah, I did not realize that, since never used this control myself.
However, I found the suggestion somewhere on the web, that you
can check this property with any other control (you can probably
create one, hidden, just for this very purpose):

http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.windowsforms/topic43420.aspx
Thanks for your answer!

Sericinus said:
Try to exploit the following idea. Check if Invoke is required
(this is the only thread-safe property of a control) and if it is,
Invoke a delegate initialized with your changeProgressBar method
instead of calling it directly.
[...]
if(toolStripProgressBar1.InvokeRequired)

The ToolStripProgressBar does not has a property "InvokeRequired" :-(
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top