查询数据库的数据,是个比较费时的工作,请问如何在使用线程查询的时候显示个进度条?

emailqjc 2011-08-12 03:21:03
查询数据库的数据,是个比较费时的工作,请问如何在使用线程查询的时候显示个进度条?
我的现有代码如下,请问加进度条怎么写:
Thread tSo;

public delegate void PDelegate();

/// 开始查询提示
/// </summary>
private void SetInfoBegin()
{
this.label2.Text = "正在查询电价数据...";
}

/// <summary>
/// 查询完成提示
/// </summary>
private void SetInfoEnd()
{
this.label2.Text = "查询结束";
}



void ThreadWork()
{
label2.BeginInvoke(new PDelegate(SetInfoBegin));
DataTable dt = mydbacc.ExecuteDataSet(CommandType.Text, "select * from ecv_spbaseinfo ").Tables[0];
this.dataGridView1.BeginInvoke(new myDelegate(FillData),new object[] { dt });//异步调用(来填充)

label2.BeginInvoke(new PDelegate(SetInfoEnd));
}


/// <summary>
/// 执行查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{

try
{
tSo = new Thread(ThreadWork);
tSo.IsBackground = true;
tSo.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString() + ",数据查询失败", "查询提示", essageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
...全文
245 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
连风 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 emailqjc 的回复:]
自己搞定,贴出代码,与大家分享:
private void doProcess()
{
progressBar1.Value = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Step = 10;
while (progressBar1.Value < 100)……
[/Quote]

你这儿没有使用线程,Application.DoEvents()只是让系统先执行其它事件而已,你这样做的话,会有很大的性能问题。
建议你还是查查MSDN,关键字:BackgroundWorker
emailqjc 2011-08-16
  • 打赏
  • 举报
回复
自己搞定,贴出代码,与大家分享:
private void doProcess()
{
progressBar1.Value = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Step = 10;
while (progressBar1.Value < 100)
{
if (flag == true) { progressBar1.Value = 100; break; }
if (progressBar1.Value == 99)
{
progressBar1.Value = 0;
}
progressBar1.Value++;
Thread.Sleep(500);
Application.DoEvents(); //原因在这里,加了这句就可以了
}
}
emailqjc 2011-08-16
  • 打赏
  • 举报
回复
我想这样的,数据我点数据查询后,滚动条就在那滚动,当数据查询完了,进度条刚好走到100%
劉宏哲 2011-08-16
  • 打赏
  • 举报
回复
你想让数据查完,进度条刚好走到100%。
还是不管数据查没查完,滚动条就在那滚动?
咏殇影 2011-08-15
  • 打赏
  • 举报
回复
我是跑龙套的。
emailqjc 2011-08-15
  • 打赏
  • 举报
回复
自己再顶一下
emailqjc 2011-08-15
  • 打赏
  • 举报
回复
to 21楼朋友:
我的代码如下,怎么显示进度条可以执行,哪个查询数据就不执行呢
public delegate void myDelegate(DataTable t);

public delegate void PDelegate();

public delegate void myDelegatDoProcess();

Thread tmyThrdGetdata;

Thread tmyTrrdProcess;

public Form6()
{


tmyTrrdProcess = new Thread(new ThreadStart(ThreadProcess));

tmyThrdGetdata = new Thread(new ThreadStart(ThreadGetData));
}

/// <summary>
/// 执行查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
tmyTrrdProcess.Start();

tmyThrdGetdata.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString() + ",数据查询失败", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}


void ThreadProcess()
{
this.progressBar1.BeginInvoke(new myDelegatDoProcess(doProcess));
}

/// <summary>
/// 执行数据查询
/// </summary>
void ThreadGetData()
{
label2.BeginInvoke(new PDelegate(SetInfoBegin)); //label 显示开始查询

DataTable dt = mydbacc.ExecuteDataSet(CommandType.Text, "select * from ecv_spbaseinfo ").Tables[0];

this.dataGridView1.BeginInvoke(new myDelegate(FillData),new object[] { dt }); //填充查询结果

label2.BeginInvoke(new PDelegate(SetInfoEnd)); //label 显示查询结束
}

/// <summary>
/// 显示进度条
/// </summary>
private void doProcess()
{
toolStripProgressBar1.Value = 0;
toolStripProgressBar1.Minimum = 0;
toolStripProgressBar1.Maximum = 100;
toolStripProgressBar1.Step = 1;
while (toolStripProgressBar1.Value < 100)
{
if (toolStripProgressBar1.Value == 99)
{
toolStripProgressBar1.Value = 0;
}
System.Threading.Thread.Sleep(100);
toolStripProgressBar1.Value++;
}
}


private void FillData(DataTable dt)
{
this.dataGridView1.DataSource = dt.DefaultView;
}

/// <summary>
/// 开始查询提示
/// </summary>
private void SetInfoBegin()
{
this.label2.Text = "正在查询电价数据...";
}

/// <summary>
/// 查询完成提示
/// </summary>
private void SetInfoEnd()
{
this.label2.Text = "查询结束";
}


xutao888 2011-08-15
  • 打赏
  • 举报
回复
开个线程弹出一个新的窗体,窗体上放个进度条,这个进度条是循环跑的,类似于XP启动的那个进度条就好了,查询完了吧窗体关掉


开线程代码:
Thread th = new Thread(new ThreadStart(Load))
th.IsBackGround = true;
th.start();

private void Load()
{
//这里弹出一个新的窗体,上面放进度条
}


//新的窗体进度条:每次跑到100的时候再从0开始,无限循环
emailqjc 2011-08-15
  • 打赏
  • 举报
回复
to 19楼朋友:

if (progressBar1.Value == 100)
{
progressBar1.Value = 0;
}

做数据库查询根本就不知道需要多长时间啊
劉宏哲 2011-08-15
  • 打赏
  • 举报
回复
private Timer timer;

public Form1()
{
InitializeComponent();
timer = new Timer() { Interval = 500 };
timer.Tick += (sender, e) =>
{
progressBar1.Value++;
if (progressBar1.Value == 100)
{
progressBar1.Value = 0;
}
};
}

private void button1_Click(object sender1, EventArgs e1)
{
timer.Start();
}

private void button2_Click(object sender, EventArgs e)
{
timer.Stop();
}
emailqjc 2011-08-15
  • 打赏
  • 举报
回复
别掉下去了
bios8086 2011-08-13
  • 打赏
  • 举报
回复
我帮你顶下,到时候给点分
emailqjc 2011-08-13
  • 打赏
  • 举报
回复
自己顶一下,别掉下去了
emailqjc 2011-08-13
  • 打赏
  • 举报
回复
再顶一下
emailqjc 2011-08-13
  • 打赏
  • 举报
回复
怎么只有人顶,没人给出集体答案
emailqjc 2011-08-12
  • 打赏
  • 举报
回复
BackgroundWorker 类怎么写呢
catchdream 2011-08-12
  • 打赏
  • 举报
回复
BackgroundWorker 好像可以吧,不过这样阻塞了线程了。
emailqjc 2011-08-12
  • 打赏
  • 举报
回复
to 7楼,8楼的朋友:
请问具体代码怎么写啊
连风 2011-08-12
  • 打赏
  • 举报
回复
BackgroundWorker类
ZMDDD 2011-08-12
  • 打赏
  • 举报
回复
可以用异步处理,注意不要让进程阻塞,导致进度条卡死! 一般取数据的代码 放到BeginInvoke之外,对页面控件的操作放到BeginInvoke里面! 同时注意lock........
加载更多回复(6)

110,566

社区成员

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

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

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