469,306 Members | 1,850 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,306 developers. It's quick & easy.

Changing ProgressBar in a seperate Thread

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
Nov 20 '06 #1
3 34202
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;
}
}
}
}
Martin Pöpping wrote:
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
Nov 20 '06 #2
Thanks for your answer!

Sericinus hunter schrieb:
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" :-(
Nov 20 '06 #3
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/m...opic43420.aspx

Martin Pöpping wrote:
Thanks for your answer!

Sericinus hunter schrieb:
> 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" :-(
Nov 20 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

8 posts views Thread by needin4mation | last post: by
4 posts views Thread by pmcguire | last post: by
3 posts views Thread by Mitchell Vincent | last post: by
1 post views Thread by nobody | last post: by
2 posts views Thread by =?Utf-8?B?QWFyb24=?= | last post: by
6 posts views Thread by JB | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by harlem98 | last post: by
reply views Thread by harlem98 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.