2个线程同时操作2个不同progressbar问题

咖啡2003 2007-10-27 04:54:23
怎么用2个不同进程让两个不通的progressbar,一个progressbar1一个progressbar2同时从1走到100?
我用2格线程只能是第一个走完后第二个才开始走,而不是同同时的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Test
{
public partial class Form1 : Form
{
private object thislock=new object();

public Form1()
{
InitializeComponent();
}
delegate void procCallBack();
delegate void procCallBack2();

private void porc_1()
{
//int i = 0;

while (progressBar1.Value<progressBar1.Maximum)
{
if (!progressBar1.InvokeRequired)
{
progressBar1.Value++;
}
else
{
procCallBack pbl = new addlist(porc_1);
this.Invoke(pb1);
}
//i++;
}
}

private void porc_2()
{
//int i = 0;

while (progressBar2.Value < progressBar2.Maximum)
{
if (!progressBar2.InvokeRequired)
{
progressBar2.Value++;
}
else
{
procCallBack2 pb2 = new addlist2(porc_2);
this.Invoke(pb2);
}
//i++;
}
}

private void btn_start_Click(object sender, EventArgs e)
{
Thread mythread = new Thread(new ThreadStart(porc_1));
Thread mythread2 = new Thread(new ThreadStart(proc_2));
mythread.IsBackground = true;
mythread2.IsBackground = true;
mythread.Start();
mythread2.Start();
}
}
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
咖啡2003 2007-10-27
  • 打赏
  • 举报
回复
自己解决

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Test
{
public partial class Form1 : Form
{
delegate void SetValueCallback(ProgressBar ctl, int value);
delegate void SetValueCallback2(ProgressBar ctl, int value);
AutoResetEvent au = new AutoResetEvent(false);
//ManualResetEvent mu = new ManualResetEvent(false);
public Form1()
{
InitializeComponent();
}

private void button1_Click_1(object sender, EventArgs e)
{
this.progressBar1.Value = 0;
this.progressBar1.Maximum = 20;
this.progressBar2.Value = 0;
this.progressBar2.Maximum = 100;
Thread t1 = new Thread(new ParameterizedThreadStart(ThreadExecute1));
Thread t2 = new Thread(new ParameterizedThreadStart(ThreadExecute2));
t1.Start(progressBar1);
t2.Start(progressBar2);
}
private void ThreadExecute1(object ctl)
{
for (int i = 0; i < 20; i++)
{
SetValue((ProgressBar)ctl, i);
Thread.Sleep(1);
au.WaitOne();
}
}
private void ThreadExecute2(object ctl)
{
while (progressBar1.Value < 20)
{
SetValue2((ProgressBar)ctl, 0);
for (int i = 0; i < 100; i++)
{
SetValue((ProgressBar)ctl, i);
Thread.Sleep(1);
}
au.Set();
}
}
private void SetValue(ProgressBar ctl, int value)
{
if (ctl.InvokeRequired)
{
SetValueCallback d = new SetValueCallback(SetValue);
this.BeginInvoke(d, new object[] { ctl, value });
}
else
{
ctl.Value++;
}
}
private void SetValue2(ProgressBar ctl, int value)
{
if (ctl.InvokeRequired)
{
SetValueCallback2 d = new SetValueCallback2(SetValue2);
this.BeginInvoke(d, new object[] { ctl, value });
}
else
{
ctl.Value = 0;
}
}
}
}
咖啡2003 2007-10-27
  • 打赏
  • 举报
回复
楼上的不行
SDFDSAC 2007-10-27
  • 打赏
  • 举报
回复
这样?
private void porc_2()
{
//int i = 0;

while ( progressBar2.Value < progressBar2.Maximum)
{
if (progressBar1.Value == progressBar1.Maximum)
{
if (!progressBar2.InvokeRequired)
{
progressBar2.Value++;
}
else
{
procCallBack2 pb2 = new procCallBack2(porc_2);
this.Invoke(pb2);
}
}
//i++;
}
}
咖啡2003 2007-10-27
  • 打赏
  • 举报
回复
神啊,救救我吧
咖啡2003 2007-10-27
  • 打赏
  • 举报
回复
来人啊
咖啡2003 2007-10-27
  • 打赏
  • 举报
回复
用力顶

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧