<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      導(dǎo)航

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理

       

      1、方法一:使用線程

           功能描述:在用c#做WinFrom開發(fā)的過程中。我們經(jīng)常需要用到進(jìn)度條(ProgressBar)用于顯示進(jìn)度信息。這時(shí)候我們可能就需要用到多線程,如果不采用多線程控制進(jìn)度條,窗口很容易假死(無法適時(shí)看到進(jìn)度信息)。下面我就簡單結(jié)合一個(gè)我寫的例子給大家做一個(gè)介紹。

      第一步:設(shè)計(jì)界面,注意需要引用 using System.Threading;

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華
      控件名稱分別為:
      progressBar1;label1;textBox1;button1;

      第二步:定義一個(gè)代理,用于更新ProgressBar的值(Value)及在執(zhí)行方法的時(shí)候,返回方法的處理信息。

              private delegate void SetPos(int ipos,string vinfo);//代理

      第三步:進(jìn)度條值更新函數(shù)(參數(shù)必須跟聲明的代理參數(shù)一樣)

              private void SetTextMesssage(int ipos,string vinfo)
              {
                  if (this.InvokeRequired)
                  {
                      SetPos setpos = new SetPos(SetTextMesssage);
                      this.Invoke(setpos, new object[] { ipos,vinfo });
                  }
                  else
                  {
                      this.label1.Text = ipos.ToString() + "/1000";
                      this.progressBar1.Value = Convert.ToInt32(ipos);
                      this.textBox1.AppendText(vinfo);
                  }
              }

      第四步:函數(shù)實(shí)現(xiàn)

              private void button1_Click(object sender, EventArgs e)
              {
                  Thread fThread = new Thread(new ThreadStart(SleepT));
                  fThread.Start();
              }

      第五步:新的線程執(zhí)行函數(shù):

              private void SleepT()
              {
                  for (int i = 0; i < 500; i++)
                  {
                      System.Threading.Thread.Sleep(10);
                      SetTextMesssage(100*i/500,i.ToString()+"\r\n");
                  }
              }

      程序運(yùn)行效果圖:

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華
       
      =========================================================================================
      2、第二種方法:
           功能描述:該種方法通過控件backgroundWorker1實(shí)現(xiàn),進(jìn)度條。卻進(jìn)度條在一個(gè)模板窗體內(nèi)。
       
      第一步:主窗體設(shè)計(jì):
       

       控件名稱:

      button1;backgroundWorker1;

      對backgroundWorker1控件,屬性設(shè)置:

       
       

       第二步:主頁面后臺代碼:

      using System.Threading;//引用空間名稱

              private void button1_Click(object sender, EventArgs e)
              {
                  this.backgroundWorker1.RunWorkerAsync(); // 運(yùn)行 backgroundWorker 組件

                  ProcessForm form = new ProcessForm(this.backgroundWorker1);// 顯示進(jìn)度條窗體
                  form.ShowDialog(this);
                  form.Close();
              }

              private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
              {
                  if (e.Error != null)
                  {
                      MessageBox.Show(e.Error.Message);
                  }
                  else if (e.Cancelled)
                  {
                  }
                  else
                  {
                  }
              }
              //你可以在這個(gè)方法內(nèi),實(shí)現(xiàn)你的調(diào)用,方法等。
              private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
              {
                  BackgroundWorker worker = sender as BackgroundWorker;
                  for (int i = 0; i < 100; i++)
                  {
                      Thread.Sleep(100);
                      worker.ReportProgress(i);
                      if (worker.CancellationPending)  // 如果用戶取消則跳出處理數(shù)據(jù)代碼 
                      {
                          e.Cancel = true;
                          break;
                      }
                  }
              }
      分別為button控件和backgroundWorker1控件選好事件。

      第三步:設(shè)置子窗體(及顯示進(jìn)度條的窗體):

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華
      控件名稱:
      progressBar1;button1
       
      第四步:子窗體,后臺代碼:

               private BackgroundWorker backgroundWorker1; //ProcessForm 窗體事件(進(jìn)度條窗體)

              public ProcessForm(BackgroundWorker backgroundWorker1)
              {
                  InitializeComponent();

                  this.backgroundWorker1 = backgroundWorker1;
                  this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
                  this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
              }

              void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
              {
                  //this.Close();//執(zhí)行完之后,直接關(guān)閉頁面
              }

              void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
              {
                  this.progressBar1.Value = e.ProgressPercentage;
              }

              private void button1_Click(object sender, EventArgs e)
              {
                  this.backgroundWorker1.CancelAsync();
                  this.button1.Enabled = false;
                  this.Close();
              }
          }

      只為button選好事件
       

      執(zhí)行效果為:

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華

       =================================================================================================

      3、第三種方法:

           功能描述:在處理大量數(shù)據(jù)的時(shí)候,有時(shí)候方法的執(zhí)行需要一定的時(shí)間,這時(shí)候往往會造成頁面或程序的“假死”狀態(tài),給用戶的體驗(yàn)度也不是很好。為了避免出現(xiàn)“假死”提高用戶的體驗(yàn)度,在這里為這類型的方法加了一個(gè)進(jìn)度條和一個(gè)文本框,進(jìn)度條用于顯示程序處理的進(jìn)度,文本框用于顯示在處理過程中,給與的提示。本方法主要使用了控件:backgroundWorker1;說明:本方法與上面的方法(方法二)基本類型,主要是設(shè)計(jì)和代碼進(jìn)行了一些修改。


       第一步:主窗體設(shè)計(jì):

      控件名稱:

      button1;backgroundWorker1;

      對backgroundWorker1控件,屬性設(shè)置:


       

      第二步:主窗體 后臺代碼:

              private void button1_Click(object sender, EventArgs e)
              {
                  this.backgroundWorker1.RunWorkerAsync(); // 運(yùn)行 backgroundWorker 組件

                  ProcessForm form = new ProcessForm(this.backgroundWorker1);// 顯示進(jìn)度條窗體
                  form.ShowDialog(this);
                  form.Close();
              }

              private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
              {
                  if (e.Error != null)
                  {
                      MessageBox.Show(e.Error.Message);
                  }
                  else if (e.Cancelled)
                  {
                  }
                  else
                  {
                  }
              }
              //你可以在這個(gè)方法內(nèi),實(shí)現(xiàn)你的調(diào)用,方法等。
              private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
              {
                  BackgroundWorker worker = sender as BackgroundWorker;
                  for (int i = 0; i < 100; i++)
                  {
                      Thread.Sleep(100);
                      worker.ReportProgress(i, i.ToString() + "  你好!\r\n"); //注意:這里向子窗體返回信息值,這里是兩個(gè)值,一個(gè)用于進(jìn)度條,一個(gè)用于文本框的。
                      if (worker.CancellationPending)  // 如果用戶取消則跳出處理數(shù)據(jù)代碼 
                      {
                          e.Cancel = true;
                          break;
                      }
                  }
              }

      第三步:設(shè)置子窗體(及顯示進(jìn)度條的窗體):

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華

       控件:

      progressBar1;textBox1;button1

      第四步:子窗體后臺代碼:

              private BackgroundWorker backgroundWorker1; //ProcessForm 窗體事件(進(jìn)度條窗體)

              public ProcessForm(BackgroundWorker backgroundWorker1)
              {
                  InitializeComponent();

                  this.backgroundWorker1 = backgroundWorker1;
                  this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
                  this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
              }

              void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
              {
                  //this.Close();//執(zhí)行完之后,直接關(guān)閉頁面
              }

              void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
              {
                  this.progressBar1.Value = e.ProgressPercentage;
                  this.textBox1.AppendText(e.UserState.ToString());//主窗體傳過來的值,通過e.UserState.ToString()來接受
              }

              private void button1_Click(object sender, EventArgs e)
              {
                  this.backgroundWorker1.CancelAsync();
                  this.button1.Enabled = false;
                  this.Close();
              }

      實(shí)現(xiàn)的效果:

      實(shí)現(xiàn)winfrom進(jìn)度條及進(jìn)度信息提示,winfrom程序假死處理 - china_xuhua - 許華
      注意:如果在程序?yàn)閳?zhí)行完,就點(diǎn)擊取消的話,很有可能會報(bào)錯(cuò)的,這時(shí)候,你就修改一個(gè)方法:backgroundWorker1_ProgressChanged
      如下:
              void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
              {
                  this.progressBar1.Value = e.ProgressPercentage;
                  this.textBox1.Text += e.UserState.ToString(); //主窗體傳過來的值,通過e.UserState.ToString()來接受
              }
             把這個(gè)方法,替換上邊的那個(gè)方法,就可以了。
      =====================================================================================================
      4、第四種方法:
           功能描述:本方法實(shí)現(xiàn)進(jìn)度條顯示,方法執(zhí)行信息反饋顯示。用到的技術(shù)點(diǎn)為 線程與代理。
           
          步驟一:添加主頁面。
              
      控件名稱:
      button1;
       
        步驟二:主頁面后臺代碼
              using System.Threading;//引用此命名
       
              //創(chuàng)建代理。
              private Form6 myProcessBar = null;//彈出的子窗體(用于顯示進(jìn)度條)
              private delegate bool IncreaseHandle(int nValue,string vinfo);//代理創(chuàng)建
              private IncreaseHandle myIncrease = null;//聲明代理,用于后面的實(shí)例化代理
              private int vMax = 100;//用于實(shí)例化進(jìn)度條,可以根據(jù)自己的需要,自己改變
       
              private void button1_Click(object sender, EventArgs e)
              {
                  Thread thdSub = new Thread(new ThreadStart(ThreadFun));
                  thdSub.Start();
              }
              private void ThreadFun()
              {
                  MethodInvoker mi = new MethodInvoker(ShowProcessBar);
                  this.BeginInvoke(mi);
                  Thread.Sleep(100);
                  object objReturn = null;
                  for (int i = 0; i < vMax; i++)
                  {
                      objReturn = this.Invoke(this.myIncrease, new object[] { 2, i.ToString() + "\r\n" });
                      Thread.Sleep(50);
                  }
              }
              private void ShowProcessBar()
              {
                  myProcessBar = new Form6(vMax);
                  myIncrease = new IncreaseHandle(myProcessBar.Increase);
                  myProcessBar.ShowDialog();
                  myProcessBar = null;
              }
       
      步驟三:創(chuàng)建子窗體
       
       控件名稱:
      progressBar1;textBox1
       
      步驟四:子窗體,后臺代碼
              public Form6(int vMax)
              {
                  InitializeComponent();
                  this.progressBar1.Maximum = vMax;
              }
              public bool Increase(int nValue,string nInfo)
              {
                  if (nValue > 0)
                  {
                      if (progressBar1.Value + nValue < progressBar1.Maximum)
                      {
                          progressBar1.Value += nValue;
                          this.textBox1.AppendText(nInfo);
                          Application.DoEvents();
                          progressBar1.Update();
                          progressBar1.Refresh();
                          this.textBox1.Update();
                          this.textBox1.Refresh();
                          return true;
                      }
                      else
                      {
                          progressBar1.Value = progressBar1.Maximum;
                          this.textBox1.AppendText(nInfo);
                          //this.Close();//執(zhí)行完之后,自動關(guān)閉子窗體
                          return false;
                      }
                  }
                  return false;
              }
       
      執(zhí)行效果:
      posted on 2015-09-02 11:41  zrSoldier  閱讀(10801)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 蜜芽久久人人超碰爱香蕉| 九九热在线视频中文字幕| 亚洲欧美国产精品专区久久| 99精品国产精品一区二区| 国产精品国语对白露脸在线播放| 国产精品视频全国免费观看| 深夜宅男福利免费在线观看| 人妻少妇精品久久| 777奇米四色成人影视色区| 国产高清一区二区三区视频| 久久综合五月丁香六月丁香| 一面膜上边一面膜下边视频| 成人av一区二区三区| 国产亚洲一区二区三不卡| 国产精品自在拍首页视频8| 久久一区二区中文字幕| 精品精品亚洲高清a毛片| 瓮安县| 久久久久久久久久久久中文字幕| 国产精品v片在线观看不卡| 亚洲国产成人精品无色码| 亚洲成年轻人电影网站WWW| 国产精品亚洲二区在线播放| 不卡一区二区国产在线| 肇东市| 91精品国产综合蜜臀蜜臀| 欧美变态口味重另类在线视频| 内射干少妇亚洲69XXX| 日韩AV高清在线看片| 亚洲av成人一区二区| 中文字幕国产精品日韩| 国产亚洲精品福利在线无卡一| 久久精品免视看国产成人| 黄色免费在线网址| 岛国中文字幕一区二区 | 日本亚洲一区二区精品久久| 国语精品自产拍在线观看网站| 亚洲精品熟女一区二区| 果冻传媒一区二区天美传媒| 国产精品国产三级国快看| 亚洲人成色77777|