当前位置:编程学习 > C#/ASP.NET >>

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...哈哈


<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>
--------------------编程问答-------------------- 看样子你这应该是winform,既然你可以用循环控制你的查询,你就在循环中添加一个form.doevent()方法激活窗体就可以了,然后每次循环中显示你的进度。 --------------------编程问答-------------------- 最好的办法是用threading写一个对话框,然后对话框中放置一个progressBar,对话框就用模式对话框显示,这样直到你的代码处理完时杀掉这个线程.如果还不明白可以联系我,我告诉你详细的做法.QQ:476492162 --------------------编程问答-------------------- 使用一个进度条图片也行啊 --------------------编程问答-------------------- 想做个大概的进度条 还是要看下你2个方法中的代码 才能更好的做出来  不然很难控制的 
--------------------编程问答-------------------- 查询的时候我没有用循环,是按顺序来的,只不过是判断,如果某一个不需要查询就跳过这个查询函数.

因为没有用循环,所以我不好怎么控制进度条.

--------------------编程问答--------------------
引用 16 楼 czk0808 的回复:
查询的时候我没有用循环,是按顺序来的,只不过是判断,如果某一个不需要查询就跳过这个查询函数. 

因为没有用循环,所以我不好怎么控制进度条. 


我已经给你参考链接了... --------------------编程问答-------------------- 好,我仔细去看看去,谢谢大哥了. --------------------编程问答-------------------- 可以把费时的操作放在单独的线程里去执行,而不能在同一个主线程里执行,否则肯定会有停止的情况。

或者可以在一个单独的县城里来刷新进度条。 --------------------编程问答-------------------- 可以把那两个函数放在只做一次循环的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;//进度条还原,不再滚动
        }
--------------------编程问答--------------------
引用 24 楼 yuxuanji 的回复:
以前做过一个这样的计算水电煤气费的winform 
虽然很幼稚,不过用到自制ProgressBar+多线程


自制ProgressBar,我看到了,多线程??厄........ --------------------编程问答-------------------- 26楼的兄弟的代码,我试试看下,看怎么样 --------------------编程问答-------------------- 恩 来回滚动条确实在不要求精度,只要求程序在执行这个方面还是很好的 
--------------------编程问答-------------------- 时间很长还是建议放到线程中去执行吧。

然后在线程中通过委托操作控件就可以了。不然即使你用进度条程序还是会像假死一样的。
--------------------编程问答--------------------
引用 30 楼 xiaomatian 的回复:
时间很长还是建议放到线程中去执行吧。 

然后在线程中通过委托操作控件就可以了。不然即使你用进度条程序还是会像假死一样的。 

假的不知道有什么用 --------------------编程问答-------------------- 这个...
多线程咯.
--------------------编程问答-------------------- 楼上兄弟,多线程怎么操作?
可否告知具体实现方法? --------------------编程问答-------------------- 定义一个委托,使用异步调用,实际也就是利用多线程,但是系统自己使用线程池。然后显示一个进度条
然后在写一个回调方法,当异步线程完成后会调用这个方法,在此方法中可以进行一些完成够的操作,比如处理数据和取消进度条


  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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,