100分求做一个假进度条,高手请进,马上给分!!!
我目前有一个自己做的查询,代码如下:
private void button1_Click(object sender, EventArgs e)//执行查询
{
this.Cursor = Cursors.WaitCursor; //获取鼠标的形状,为沙漏形状
DateTime KaiShi = DateTime.Now;
Pffx_hz(); //这个是一个查询的函数,主要是这里要的时间很长;
Pffx_gyd();//这个是另外一个查询的函数,主要也是这里要的时间很长;
DateTime Eend = DateTime.Now;
TimeSpan XiangCha = Eend - KaiShi;
string zhixing = XiangCha.Minutes + "分" + XiangCha.Seconds + "秒";
this.Cursor = Cursors.Default; //获取鼠标为正常形状
MessageBox.Show("此查询一共用时:" + zhixing, "提示");
}
以上是一部分代码,我的关键是要在执行这个查询的时候,同时显示一个假进度条,不至于查询很长时间结果出来的中间好像死机一样,给个进度条给客户看到好些,请问各位高手,我应该怎么操作?
给个代码最好,马上给分!! --------------------编程问答-------------------- 不知道Pffx_hz()和Pffx_gyd()具体代码是什么 ? 我做的一次进度条的 是根据for循环来控制整个进度条的 --------------------编程问答-------------------- ProgressBar 可以用这个控件
--------------------编程问答-------------------- 可以吧把你的方法贴出来看看吗?
private void btnSubmit_Click(object sender, EventArgs e)
{
prbState.Visible = true;
prbState.Minimum = 0;
prbState.Step = 1;
prbState.Value = 0;
prbState.Maximum = 100;
for(int i=0;i<100;i++)
{
prbState.PerformStep();
}
}
Pffx_hz()和Pffx_gyd()是两个做好的函数,我只要执行这两个函数就可以得到我要的结果,现在是我不知道这两个函数大概要花多少时间,
如果可以,我想大概定义一个时间,让时间慢慢走,然后走到90%的时候,再根据结果到100%完成.
可以实现吗?
知道的高手请指点或代码,我的Email:czk0505@163.com
解决后马上给分,不够可以加分的. --------------------编程问答-------------------- 参考http://topic.csdn.net/u/20080526/17/c213d64e-b570-4a9b-a41a-59f96f042685.html --------------------编程问答-------------------- 2楼的这个不行.
因为你这个无法控制我的两个查询,如果把你这段代码放在前面的法,那进度条就直接一下到100%,然后才开始执行我下面的代码;
如果我放在我的下面的法,那是等我结果出来了才执行你这个,也就是说要等查询结果出来了,进度条才一下就到100%,这些都不是我想要的;
我想应该要用到多线程吧?
但是不晓得怎么搞! --------------------编程问答-------------------- 因为查询时间无法判定,所以,真的是个假进度条.
既然是假的,你就再开一个线程,估算一下时间,然后略慢于检索的时间,让它慢慢走吧.那边的查询一结束,就把这个进度条结束掉就是了.
--------------------编程问答-------------------- 改变ProgressBar控件的Value值,可以不停的翻来覆去的滚嘛,走到头了又从0开始,等执行完了把进度条关掉好了,因为你不知道你的具体的执行时间的。 --------------------编程问答-------------------- 6楼的大哥,你这个想法是对的,但是我要怎么实现呢,可以给我代码示例不? --------------------编程问答-------------------- 6楼和7楼的兄弟,帮帮忙,解决解决这个问题! --------------------编程问答-------------------- 参考
http://blog.csdn.net/jinjazz/archive/2008/05/24/2477088.aspx --------------------编程问答-------------------- 楼主!拿分来!真的pageloading!是真的!o(∩_∩)o...哈哈
--------------------编程问答-------------------- 看样子你这应该是winform,既然你可以用循环控制你的查询,你就在循环中添加一个form.doevent()方法激活窗体就可以了,然后每次循环中显示你的进度。 --------------------编程问答-------------------- 最好的办法是用threading写一个对话框,然后对话框中放置一个progressBar,对话框就用模式对话框显示,这样直到你的代码处理完时杀掉这个线程.如果还不明白可以联系我,我告诉你详细的做法.QQ:476492162 --------------------编程问答-------------------- 使用一个进度条图片也行啊 --------------------编程问答-------------------- 想做个大概的进度条 还是要看下你2个方法中的代码 才能更好的做出来 不然很难控制的
<html>
<head>
<title></title>
<script type="text/javascript">
var url = 'http://www.google.co.uk/search?hl=en&q=asp.net&meta='; //the details page you want to display...
</script>
<style>
.loading-indicator {
font-size:8pt;
background-image:url(../images/loading/loading.gif);
background-repeat: no-repeat;
background-position:top left;
padding-left:20px;
height:18px;
text-align:left;
}
#loading{
position:absolute;
left:45%;
top:40%;
border:3px solid #B2D0F7;
background:white url(../images/loading/block-bg.gif) repeat-x;
padding:10px;
font:bold 14px verdana,tahoma,helvetica;
color:#003366;
width:180px;
text-align:center;
}
</style>
<div id="loading">
<div class="loading-indicator">
Page Loading...
</div>
</div>
</head>
<body onload="location.href = url;" style="overflow:hidden;overflow-y:hidden">
</body>
<script>
if(document.layers) {
document.write('<Layer src="' + url + '" visibility="hide"></Layer>');
}
else if(document.all || document.getElementById) {
document.write('<iframe src="' + url + '" style="visibility:hidden;"></iframe>');
}
else {
location.href = url;
}
</script>
</html>
--------------------编程问答-------------------- 查询的时候我没有用循环,是按顺序来的,只不过是判断,如果某一个不需要查询就跳过这个查询函数.
因为没有用循环,所以我不好怎么控制进度条.
--------------------编程问答--------------------
我已经给你参考链接了... --------------------编程问答-------------------- 好,我仔细去看看去,谢谢大哥了. --------------------编程问答-------------------- 可以把费时的操作放在单独的线程里去执行,而不能在同一个主线程里执行,否则肯定会有停止的情况。
或者可以在一个单独的县城里来刷新进度条。 --------------------编程问答-------------------- 可以把那两个函数放在只做一次循环的for()结构中,再在for()设置进度条的相关参数. --------------------编程问答-------------------- 路过学习:) --------------------编程问答-------------------- 假的不好控制进度,你可以换一个思路,反正就是让客户知道还在插叙。不是死机了,你可以做一个循环播放的进度条啊,点击查询就开始循环播放,查询完毕,显示结果,就结束循环播放,让客户知道在动,就可以了。 --------------------编程问答-------------------- 那个
没必要作假得吧
做成真的
不好么? --------------------编程问答-------------------- 以前做过一个这样的计算水电煤气费的winform
虽然很幼稚,不过用到自制ProgressBar+多线程
给你看看源码吧
using System;--------------------编程问答-------------------- 感谢你们了,我来试试 --------------------编程问答-------------------- 呵呵,各位把楼主吓怕了!
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using BylProgress;
namespace _02Fee
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
radioButton3.Checked = true;
unitCount = 3;
ReadBinaryFile();
bylProbar.Visible = false;
}
int c1;
int p1=1;
private int unitCount;
private FileStream file;
private Stream stream;
private void ReadBinaryFile()
{
try
{
stream = new FileStream(@"c:\702fee.ini", FileMode.Open);
IFormatter formatter = new BinaryFormatter();
txtLastAllCharge.Text = (string)formatter.Deserialize(stream);
}
catch (Exception e)
{
statusStrip1.Visible = true;
statusStrip1.Text = e.Message;
txtLastAllCharge.Text = "0";
}
finally
{if(stream!=null)
stream.Close();
//stream.Dispose();
}
}
private void WriteBinaryFile()
{
try
{
file = new FileStream(@"c:\702fee.ini", FileMode.Create);
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(file, txtNowAllCharge.Text);
}
finally
{
file.Close();
//file.Dispose();
}
}
private void button1_Click(object sender, EventArgs e)
{
GetCharge();
GetChargeEach();
txtNowAllCharge.Text = (Convert.ToDouble(txtChargeWater.Text) + Convert.ToDouble(txtChargePower.Text) + Convert.ToDouble(txtChargeGas.Text)).ToString("0.00");
WriteBinaryFile();
bylProbar.Visible = true;
btnCalc.Visible = false;
timer1.Interval =1;
timer1.Start();
c1 = bylProbar.Position;
}
private void GetCharge()
{
txtChargeWater.Text = Cost(txtNowWater.Text, txtLastWater.Text, txtFeeWater.Text);
txtChargePower.Text = Cost(txtLastPower.Text, txtNowPower.Text, txtFeePower.Text);
txtChargeGas.Text = Cost(txtLastGas.Text, txtNowGas.Text, txtFeeGas.Text);
}
private void GetChargeEach()
{
txtChargeWaterEach.Text = EachCost(txtChargeWater.Text);
txtChargePowerEach.Text = EachCost(txtChargePower.Text);
txtChargeGasEach.Text = EachCost(txtChargeGas.Text);
}
private string Cost(string now, string last, string fee)
{
double r = 0.0;
try { r = Convert.ToDouble(now) - Convert.ToDouble(last); }
catch (Exception e) { statusStrip1.Text = e.ToString(); }
return (r * Convert.ToDouble(fee)).ToString("0.00");
}
private string EachCost(string charge)
{
if (charge != string.Empty)
return (double.Parse(charge) / unitCount).ToString("0.00");
else return "";
}
private void Form1_Load(object sender, EventArgs e)
{
toolStripStatusLabel1.Text += " 今天是 " + DateTime.Today.ToLongDateString() + " " + "星期" + "日一二三四五六".Substring((int)System.DateTime.Now.DayOfWeek, 1); ;
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
unitCount = 1;
GetChargeEach();
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
unitCount = 2;
GetChargeEach();
}
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
unitCount = 3;
GetChargeEach();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (c1 == bylProbar.PositionMax)
{
p1 = 0;
timer1.Stop();
bylProbar.Visible = false;
btnCalc.Enabled = true;
btnCalc.Visible = true;
}
else
if (c1 == bylProbar.PositionMin)
{
p1 = 1;
}
c1 += p1;
bylProbar.Text = c1.ToString() + " %";
bylProbar.Position = c1;
}
}
}
你的问题,确实适合做一个滚动条(即来回滚动,让客户知道程序还活着),通过把.net自带的ProgressBar进度条控件的Style属性设置为Marquee即能得到滚动条.通过异步调用即可实现,修改后的代码大概如下:我在界面上拖了一个ProgressBar,名为:progressBar1
--------------------编程问答--------------------
private void button1_Click(object sender, EventArgs e)//执行查询
{
this.Cursor = Cursors.WaitCursor; //获取鼠标的形状,为沙漏形状
//让界面上的进度条滚动
progressBar1.Style = ProgressBarStyle.Marquee;
//通过异步调用长时间查询
MethodInvoker mi = new MethodInvoker(DoSomething);
mi.BeginInvoke(null, null);
}
private void DoSomething()
{
DateTime KaiShi = DateTime.Now;
Pffx_hz(); //这个是一个查询的函数,主要是这里要的时间很长;
Pffx_gyd();//这个是另外一个查询的函数,主要也是这里要的时间很长;
DateTime Eend = DateTime.Now;
TimeSpan XiangCha = Eend - KaiShi;
string zhixing = XiangCha.Minutes + "分" + XiangCha.Seconds + "秒";
MessageBox.Show("此查询一共用时:" + zhixing, "提示");
//执行完耗时的查询,通过异步调用,停止滚动条
BeginInvoke(new MethodInvoker(Finish)) ;
}
private void Finish()
{
this.Cursor = Cursors.Default; //获取鼠标为正常形状
progressBar1.Style = ProgressBarStyle.Blocks;//进度条还原,不再滚动
}
自制ProgressBar,我看到了,多线程??厄........ --------------------编程问答-------------------- 26楼的兄弟的代码,我试试看下,看怎么样 --------------------编程问答-------------------- 恩 来回滚动条确实在不要求精度,只要求程序在执行这个方面还是很好的
--------------------编程问答-------------------- 时间很长还是建议放到线程中去执行吧。
然后在线程中通过委托操作控件就可以了。不然即使你用进度条程序还是会像假死一样的。
--------------------编程问答--------------------
假的不知道有什么用 --------------------编程问答-------------------- 这个...
多线程咯.
--------------------编程问答-------------------- 楼上兄弟,多线程怎么操作?
可否告知具体实现方法? --------------------编程问答-------------------- 定义一个委托,使用异步调用,实际也就是利用多线程,但是系统自己使用线程池。然后显示一个进度条
然后在写一个回调方法,当异步线程完成后会调用这个方法,在此方法中可以进行一些完成够的操作,比如处理数据和取消进度条
delegate void QueryDelegate(); //委托类型根据你方法的返回类型
//回调方法
static void CallbackMethod(IAsyncResult ar)
{
//查询完成够,调用此方法,结束异步调用
QueryDelegate dlgt = (AsyncDelegate) ar.AsyncState;
dlgt.EndInvoke(ar);
//这里可以加一些其他操作,比如取消进度条。
}
private void button1_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
DateTime KaiShi = DateTime.Now;
//使用委托的异步方法,并给他传递一个回调方法,但异步查询完成时可以调用这个方法。
QueryDelegate dlgt = new QueryDelegate(Pffx_hz);
IAsyncResult ar = dlgt.BeginInvoke(new AsyncCallback(CallbackMethod));
//这里可以显示一个进度条等代码
DateTime Eend = DateTime.Now;
TimeSpan XiangCha = Eend - KaiShi;
string zhixing = XiangCha.Minutes + "分" + XiangCha.Seconds + "秒";
this.Cursor = Cursors.Default;
MessageBox.Show("此查询一共用时:" + zhixing, "提示");
}
也还有其他方法,手动使用线程池或使使用Thread来控制。道理都一样。用一个新线程运行查询。然后原线程显示一个进度。
当查询完成,通知原线程,取消进度!上面大概写的。不一定对。MSDN上有异步和多线程的例子 --------------------编程问答-------------------- 要实现真的进度话,个人觉得使用一个Thread.Timer
没一段时间查询一次查询情况,但你程序里要知道要查询多少记录,已经查询了多少
然后定时返回这些信息。来控制进度条 --------------------编程问答-------------------- 使用线程做查询,显示一个等待图标ok --------------------编程问答--------------------
//frmwait.cs
//
//编译:csc frmwait.cs
using System;
using System.Threading;
using System.Windows.Forms;
class TestFrm:Form
{
Button btn = new Button ();
void bgThread (object arg)//后台线程
{
WaitForm wf = (WaitForm) arg;
//todo: 在这里做后台工作,这里用个空循环
int counter = 0;
while (counter < 2000) {
wf.Progress = counter / 2000f;
counter++;
Thread.Sleep (10);
}
MethodInvoker funcClose = wf.Close;
wf.Invoke (funcClose);
}
TestFrm ()
{
Controls.Add (btn);
btn.Text = "开始后台工作";
btn.Click += btn_click;
}
void btn_click (object sender,EventArgs e)
{
WaitForm wf = new WaitForm();
Thread th = new Thread (bgThread);
th.Start(wf);
wf.ShowDialog();
MessageBox.Show ("后台操作完成!");
}
static void Main ()
{
Application.EnableVisualStyles();
Application.Run(new TestFrm());
}
}
class WaitForm:Form
{
ProgressBar pb = new ProgressBar ();
public WaitForm()
{
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Width = 200;
this.Height = 50;
this.StartPosition = FormStartPosition.CenterParent;
this.ControlBox = false;
pb.Dock = DockStyle.Fill;
pb.Maximum = 100;
Controls.Add (pb);
Text = "后台操作中...";
}
public float Progress
{
get{
float ret = 0f;
MethodInvoker func = delegate()
{
ret = pb.Value / (float)pb.Maximum;
};
if (this.InvokeRequired)
Invoke (func);
else
func();
return ret;
}
set
{
MethodInvoker func = delegate()
{
pb.Value = (int)(pb.Maximum * value);
this.Text = string.Format ("后台操作中,已完成{0}%",value*100);
};
if (this.InvokeRequired)
Invoke (func);
else
func();
}
}
}
LZ把那个空循环换成你自己的内容. --------------------编程问答-------------------- 多线程 --------------------编程问答-------------------- 最简单的方法,弄个可显示gif图片动画的控件,操作之前显示动画,然后就做你的事情吧,做完事情后再把gif动画给停掉.这样不就OK了!! --------------------编程问答-------------------- 谢谢大家的指导,我顺便学习学习,顺便帮你顶一个,让大家还来一次更加精彩的代码!!
--------------------编程问答-------------------- 39楼的兄弟,你有这样的false图片吗?
请告诉怎么操作吧?
--------------------编程问答-------------------- mark and mark --------------------编程问答-------------------- 开双线程
A线程显示一个等待的包含动作图片(搞个转动的GIF)的窗口
B线程包含你的实际操作
A线程开启B线程
B线程结束的时候 设置A线程窗口中的显示内容 --------------------编程问答-------------------- 为你这题目而做的事例...........
我已上传....
http://download.csdn.net/source/480743
去下吧.. --------------------编程问答-------------------- 进度条,和异步一起用,或和线程一起用,先研究一下你的原码再说... --------------------编程问答-------------------- 对不起我以为中间那一大段代码是楼主的呵呵...大家回答看来已经差不多了
-_-! --------------------编程问答-------------------- 效果图:
/upload/20131225/o_ec123.jpg
为你这题目而做的事例...........
我已上传....
http://download.csdn.net/source/480743
去下吧.. --------------------编程问答-------------------- 感谢47楼的兄弟了;
我刚才从里面去下载了你的代码示例,但是不能测试,可以告诉我什么原因吗?
或则你做成一个完整的格式,可以直接用的,我就好从你这里学到知识,谢谢了,因为菜鸟,所以不是很懂。 --------------------编程问答-------------------- 感谢你们给我做了这么多好的代码,我准备加分,看你们还有没有更好的实现方法,因为我是初学的,希望能够提供给我整体代码,我可以直接执行的,我慢慢来看你们的代码,这样可以加深我的印象;
我再加100分上去。
大家畅所欲言!
感谢了!
希望不要灌水,能够解决问题就最好。 --------------------编程问答-------------------- 不会用47楼的,就直接加我Q吧..我给你讲解你所下载的事例使用...呵呵...
QQ:214958266 kevery --------------------编程问答-------------------- 我给你思路,我有类似的winform项目做过
http://download.csdn.net/source/482165
1.在窗体里使用一个进度条ProgressBar
2.声明ProgressBar.value的委托事件(我们使用了线程,ProgressBar.value=?会跨线程操作需要委托)
3.声明开始和结束的时间,以及使用Threading.Timers类的回调对象方法
/*
DateTime starttime;
DateTime endtime;
DateTime downtime;
Pffx_hz(); //这个是一个查询的函数,主要是这里要的时间很长;
Pffx_gyd();//这个是另外一个查询的函数,主要也是这里要的时间很长;
要改一点,写成void Pffx_hz(object o)....
你再看我在TCPSocketService.cs里 private static int WriteFiles( Socket _socket,int receiveCount, byte[] buffers)
*/
private static int WriteFiles( Socket _socket,int receiveCount, byte[] buffers)
{
int flag = -1;
char[] chars = new char[receiveCount + 1];
string szData = Encoding.UTF8.GetString(buffers, 0, receiveCount);
//System.Windows.Forms.MessageBox.Show(szData);
if (szData.Length > filename.Length && szData.Substring(0, filename.Length).StartsWith(filename) && filename.Equals(szData.Split('|')[0]))
{//判断第一个发送的tcp消息,返回的文件名和文件的大小
fname = szData.Split('|')[0];
fsize = Convert.ToInt32(szData.Split('|')[1]);
if (fname == "" || fsize == 0)
{
System.Windows.Forms.MessageBox.Show("没有获得下载的播放器文件名与大小!");
return flag = -1 ;
}
sw = new FileStream(savepath + "\\" + filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite);
sr = new BinaryWriter(sw, Encoding.Default);
fi = new System.IO.FileInfo(savepath + "\\" + filename);
flag = 0;
//BizLogic.LogWriter.AddServerInfo("WriteFiles", " filename;" + fname + ",fsize:" + fsize.ToString());
starttime = DateTime.Now;
}
else
{
/*这里的问题: 线程同步,与线程锁
* 当 sr.Write(state.buffer, 0, iRx); 执行时,为防止其它线程执行写入,将后面进入的要写入的数据阻止在循环中
* 当sr.Write完成, Writing = false;,等待中的state.buffer数据才会退出循环,执行sr.Write()方法
*/
//如果是新开始接收数据包
//count用来计数已经下载了多少字节
while (Writing == true)
{
System.Windows.Forms.Application.DoEvents();
}
if (sw != null && sr != null)
{
Writing = true;
sr.Write(buffers, 0, receiveCount);// System.ObjectDisposedException Message="Cannot access a closed file." 多任务下载
count += receiveCount;
double _Doud = (double)count / (double)fsize * 100;
FileDownloader.BizLogic.UIFacade.frmGetFiles.SetDownloadProgressBarValue((int)_Doud);
//每秒内下载速度计数
//downtime = DateTime.Now;
//TimeSpan tsdown = downtime - starttime;
//double kbps = count / tsdown.TotalSeconds / 1024;
//FileDownloader.BizLogic.UIFacade.frmGetFiles.safeToolStripLabelDownpect.Text = ((int)kbps).ToString() + "kbps";
System.Threading.Timer tt = new System.Threading.Timer(new System.Threading.TimerCallback(DisplayKbps), null, 0, 1000);
Writing = false;
}
//--------------------------------
//if (sr != null)
//{
// lock (sr)
// {
// sr.Write(state.buffer, 0, iRx);
// count += iRx;
// }
//}
//----------------------------------------
flag = 0;
}
if (count == fsize)
{
endtime = DateTime.Now;
TimeSpan tsend = endtime - starttime;
double kbps = count / tsend.TotalSeconds / 1024;
FileDownloader.BizLogic.UIFacade.frmGetFiles.safeToolStripLabelDownpect.Text = ((int)kbps).ToString() + "kbps";
Thread.Sleep(1000);
BizLogic.LogWriter.AddServerInfo("下载完成!", "文件保存在:"+savepath + "\\" + filename);
count = 0;
filename = "";
fsize = 0;
//Writing = false;
if (sr != null) { sr.Close(); }
if (sw != null) { sw.Close(); }
if (_socket != null) { _socket.Close(); }
flag = 1;
if (System.Windows.Forms.MessageBox.Show("下载完成!!!", "提示", System.Windows.Forms.MessageBoxButtons.OK) == System.Windows.Forms.DialogResult.OK)
{
FileDownloader.BizLogic.UIFacade.frmGetFiles.EnabledbtnDownload(true);
FileDownloader.BizLogic.UIFacade.frmGetFiles.EnabledbtnDIRSave(true);
FileDownloader.BizLogic.UIFacade.frmGetFiles.SetDownloadProgressBarValue(0);
FileDownloader.BizLogic.UIFacade.frmGetFiles.VisibleToolStripCtls(false);
flag = 2;
}
}
return flag;
}
private static void DisplayKbps( object obj)
{
downtime = DateTime.Now;
TimeSpan tsdown = downtime - starttime;
double kbps = count / tsdown.TotalSeconds / 1024;
FileDownloader.BizLogic.UIFacade.frmGetFiles.safeToolStripLabelDownpect.Text = ((int)kbps).ToString() + "kbps";
}
意思是我下载文件时实现下载的进度计数,
你要改的是Pffx_hz()放到new System.Threading.Timer(new System.Threading.TimerCallback(Pffx_hz), null, 0, 10000);
10秒没做完,你加个属性bool判断超时!慢慢看,不懂在联系我wangkuang5@163.com
--------------------编程问答--------------------
使用"http://download.csdn.net/source/480743"下载后,在目录"滚动条/程序集DLL/schedule.dll"把这个文件添加到引用,
该文件"schedule.dll"中有三个类:
ScheduleMoveControl >> 控件式滚动条.可移动
ScheduleControl >> 控件式滚动条.不可移动
ScheduleForm >> 窗体式滚动条.可移动
三个类中都有以下相同的方法:
StartSchedule(); >>>>开始滚动
EndSchedule(); >>>>结束滚动
显示信息属性:ShowText
之后在你要使用该程序集的CS文件的命名空间中加上 using kevery;
之后,以你上面的代码为例:如下
private void button1_Click(object sender, EventArgs e)//执行查询
{
this.Cursor = Cursors.WaitCursor; //获取鼠标的形状,为沙漏形状
DateTime KaiShi = DateTime.Now;
//在此处加上滚动代理如下
//*******************************************
kevery.ScheduleForm ksf=new kevery.ScheduleForm();//窗体式滚动条.可移动
ksf.ShowText="窗体式滚动[查询中,请稍后....";
ksf.StartSchedule();//开始滚动
//***********************************************
Pffx_hz(); //这个是一个查询的函数,主要是这里要的时间很长;
Pffx_gyd();//这个是另外一个查询的函数,主要也是这里要的时间很长;
//***********************************************
ksf.EndSchedule();//滚结束
//************************************************
DateTime Eend = DateTime.Now;
TimeSpan XiangCha = Eend - KaiShi;
string zhixing = XiangCha.Minutes + "分" + XiangCha.Seconds + "秒";
this.Cursor = Cursors.Default; //获取鼠标为正常形状
MessageBox.Show("此查询一共用时:" + zhixing, "提示");
}
--------------------编程问答-------------------- 我的含义就是在Timer的控制时间里,完成下载进度的显示,不过我跨了线程和很多类才调用到窗体控件,界面上我是用的状态栏里的控件进度条,
注意
System.Threading.Timer tt = new System.Threading.Timer(new System.Threading.TimerCallback(Pffx_hz), null, 0, 10000);
时就立刻执行了回调方法Pffx_hz()查数据库,回调方法的对象可以不使用,看你自己的想法
我的项目代码
http://d.download.csdn.net/down/482165/wangkuang5
--------------------编程问答-------------------- 感谢你了大哥!
我下载了你的示例,但是不知道怎么使用;
可以给我说明下不?
--------------------编程问答-------------------- 之前写程序也想弄个进度条,搞了半天没搞好,现在在来学习一下 --------------------编程问答-------------------- 如果 Pffx_hz(); Pffx_gyd();实在不知它的进度和速度的话,建议可以做成两个进度条,一个表示总体进度,一个表示细节进度,排列如下:
===========================================
正在进行**查询...
细节进度条P1
总进度条P2
===========================================
P1可以不停地从0刷到100,为了表现真实性,它的进度值可以累加一个随机数,可以用Timer控制
然后总进度条可以作以下控制:
private void button1_Click(object sender, EventArgs e)//执行查询
{
this.Cursor = Cursors.WaitCursor; //获取鼠标的形状,为沙漏形状
DateTime KaiShi = DateTime.Now;
lblMsg.text = "正在进行{**操作1}...";
P1.Value = 30;
Pffx_hz(); //这个是一个查询的函数,主要是这里要的时间很长;
lblMsg.text = "正在进行{**操作2}...";
P1.Value = 60;
Pffx_gyd();//这个是另外一个查询的函数,主要也是这里要的时间很长;
lblMsg.text = "正在进行{**操作3}...";
P1.Value = 90;
DateTime Eend = DateTime.Now;
TimeSpan XiangCha = Eend - KaiShi;
string zhixing = XiangCha.Minutes + "分" + XiangCha.Seconds + "秒";
this.Cursor = Cursors.Default; //获取鼠标为正常形状
MessageBox.Show("此查询一共用时:" + zhixing, "提示");
}
--------------------编程问答-------------------- 哇,楼上的人太热心的,
看得我不知道该从如何下手了,呵呵!
我学习中. --------------------编程问答-------------------- 顶以下,学习学习!
补充:.NET技术 , C#