在处理长任务,大数据交互是,程序容易造成假死,用户也不知道程序在做什么,于是就需要一个进度条,但是网上进度条实例,效果都不佳,都不能实时更新进度条,比如伪进度条就只能是一张图片,还有的是事务处理完后,记录监控的时间,再完成进度条显示,这肯定是不可以的。还有一种是比较实用,但是把事务处理随着进度条一起处理,也就是进度条是从1%到100%,那么事务就处理一百次。于是结合网上实例,我写了下面的这个多线程进度条。

    我写的这个进度条的特点是:

                可以根据事务处理的时间,实时更新进度条,简单的说是:比如一个长任务,大数据交互大概要话4分钟的话,那么我们就可以把进度条从1%到100%,每跟进一步,就是40微秒,当然这是多线程的。一个线程处理进度条,主线程处理长任务,大数据交互部分,也就是说如果一个长任务,大数据交互大于4分钟,那么进度条先执行完,但是进度条线程会让自己全部执行完,才把cup交给主线程。如果正常情况一个长任务,大数据交互小于或等于,那么正好是我们要的效果。

  下面开始截图:

实际项目截图:单击提取:

 

表单进度条java后端处理_进度条

表单进度条java后端处理_webform进度条_02

测试截图图:

 

 

表单进度条java后端处理_表单进度条java后端处理_03

下面开始开代码:

 1,新建web项目:

  2.添加ProgressBar.htm页面;代码如下

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="mainWindow">
 <head>
  <title>足下教育</title>
  <base  target=_self />
  <script language="javascript" type="text/javascript">
      function SetPorgressBar(pos) {
          //设置进度条居中
          var screenHeight = window["mainWindow"].offsetHeight;
          var screenWidth = window["mainWindow"].offsetWidth;
          ProgressBarSide.style.width = Math.round(screenWidth / 2);
          ProgressBarSide.style.left = Math.round(screenWidth / 4);
          ProgressBarSide.style.top = Math.round(screenHeight / 2);
          ProgressBarSide.style.height = "21px";
          ProgressBarSide.style.display = "";

          //设置进度条百分比                      
          ProgressBar.style.width = pos + "%";
          ProgressText.innerHTML = pos + "%";
      }
      //完成后隐藏进度条
      function SetCompleted() {
          ProgressBarSide.style.display = "none";
      }

      function exception() {
          ProgressBarSide.style.display = "none";
      }
  
  </script>
 </head>
 <body style=" background-color:transparent">
  <div id="ProgressBarSide" style="position:absolute;height:21px;width:100px;color:Silver;border-width:1px;border-style:Solid;display:none;background-color:transparent">
   <div id="ProgressBar" style="position:absolute;height:21px;width:0%;background-color:#3366FF"></div>
   <div id="ProgressText" style="position:absolute;height:21px;width:100%;text-align:center"></div>
  </div>
 </body>
</html>

3.添加Demo.aspx页面

Demo.aspx 代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Demo.aspx.cs" Inherits="web进度条1.Demo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>

<body>
    <form id="form1" runat="server">
    <div>
    <asp:button runat="server" text="Button" οnclick="Unnamed1_Click" />
    </div>
    </form>
</body>
</html>

 

Demo.aspx.cs代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.IO;

namespace web进度条1
{
    public partial class Demo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        #region 进度条方法
        private void beginProgress()
        {
            //根据ProgressBar.htm显示进度条界面
            string templateFileName = Path.Combine(Server.MapPath("."), "ProgressBar.htm");
            StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("GB2312"));
            string html = reader.ReadToEnd();
            reader.Close();
            Response.Write(html);
            Response.Flush();
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            LoadData();//load数据 
            thread.Join();



        }
        private void setProgress(int percent)
        {
            Thread.Sleep(50);
            string jsBlock = "<script>SetPorgressBar('" + percent.ToString() + "'); </script>";
            Response.Write(jsBlock);
            Response.Flush();

        }
        private void finishProgress()
        {
            string jsBlock = "<script>SetCompleted();</script>";
            Response.Write(jsBlock);
            Response.Flush();
            Response.Clear();
        }
        private void exception()
        {
            string jsBlock = "<script>exception();</script>";
            Response.Write(jsBlock);
            Response.Flush();
            Response.Clear();

        }
        #endregion

        #region ThreadProc
        private void ThreadProc()
        {

            for (int i = 1; i <= 100; i++)
            {

                setProgress(i);
            }
        }
        #endregion

        #region LoadData
        private void LoadData()
        {
            //事务处理部分,下面注释的是我从数据库读取数据的测试
            //using (DataSet ds = commonws.GetDsSql("病程信息", "Dome"))
            //{
            //    datatRead();
            //}

        }
        #endregion

        protected void Unnamed1_Click(object sender, EventArgs e)
        {
            beginProgress();
            finishProgress();
        }

    }
}

下面附属一下别人的代码:

for(int i=0;i<11;i++)
             {                            //事务处理部分
          - - - - - - -
                      //显示进度条
- - - - - -
                 
                                        }

 

上面的循环一百,事务处理也是一百次,这个效果是达到,貌似事务执行时间加长了很多?

难道循环体执行了一百遍,但是事务只执行了一遍吗?