zoukankan      html  css  js  c++  java
  • 批量照片缩小器展示多线程控件BackgroundWorker后台工作使用方法

    最近出去玩,照了好多照片,想传到我的人人去,发现照片太大,传起来老费劲了。

    于是写了这个《批量照片缩小器》,顺带回忆一下BackgroundWorker这个后台工作控件的使用。

    批量照片缩小器

    界面如上,很简单不多说。效果图如下:

    (原始图片)

    sunyanzi1 yangchenglin1 yangchenglin2

    (缩小后)

    sunyanzi1 yangchenglin1 yangchenglin2

    使用BackgroundWorker的步骤:

    1. 拖拽一个BackgroundWorker控件出来

    拖拽BackgroundWorker控件

    2. 设置其属性

    设置WorkerReportsProgress和WorkerSupportsCancellation属性都为true

    image

    3. 生成事件代码

    点击闪电按钮(flash ),分别双击三个事件项目,生成三个事件代码

    image

    4. 编写后台工作事件

    worker_DoWork 
     1 private void worker_DoWork(object sender, DoWorkEventArgs e)
     2         {
     3             var param = e.Argument as ZoomData;
     4             var photoDir = new DirectoryInfo(param.photoDir);
     5             var files = photoDir.GetFiles();
     6             var userState = new ReportData() { all = files.Count(), done = 0 };
     7             worker.ReportProgress(userState.done, userState);
     8             foreach (var pic in files)
     9             {
    10                 try
    11                 {
    12                     userState.done++;
    13                     worker.ReportProgress(userState.done, userState);
    14                     var img = Image.FromFile(pic.FullName);//若不是图片,此处会报错,我就不用分析了
    15                     var width = param.percent * img.Width / 100;
    16                     if (width <= 0) width = 1;
    17                     var height = param.percent * img.Height / 100;
    18                     if (height <= 0) height = 1;
    19                     var newImage = img.GetThumbnailImage(width, height, callBack, IntPtr.Zero);
    20                     newImage.Save(Path.Combine(param.afterDir, pic.Name));
    21                     img.Dispose();
    22                     newImage.Dispose();
    23                 }
    24                 catch (System.Exception ex)
    25                 {
    26 
    27                 }
    28             }
    29         }
    worker_ProgressChanged
    1         private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    2         {
    3             var userState = e.UserState as ReportData;
    4             var value = e.ProgressPercentage * 100 / userState.all;
    5             if (value < pgbProcess.Minimum) value = pgbProcess.Minimum;
    6             if (value > pgbProcess.Maximum) value = pgbProcess.Maximum;
    7             pgbProcess.Value = value;
    8         }
    worker_RunWorkerCompleted
     1         private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
     2         {
     3             if (e.Error != null)
     4             {
     5                 MessageBox.Show(e.Error.ToString(), "发生异常");
     6                 if (MessageBox.Show("是否打开保存结果的文件夹?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
     7                     == DialogResult.Yes)
     8                 {
     9                     Process.Start("explorer", txtAfterDir.Text);
    10                 }
    11             }
    12             else if (e.Cancelled)
    13             {
    14                 if (MessageBox.Show("您取消了操作,是否打开保存结果的文件夹?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    15                     == DialogResult.Yes)
    16                 {
    17                     Process.Start("explorer", txtAfterDir.Text);
    18                 }
    19             }
    20             else
    21             {
    22                 if (MessageBox.Show("操作已完成,是否打开保存结果的文件夹?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    23                     == DialogResult.Yes)
    24                 {
    25                     Process.Start("explorer", txtAfterDir.Text);
    26                 }
    27                 pgbProcess.Value = pgbProcess.Minimum;
    28                 //lblProgress.Text = "";
    29                 btnStart.Text = "开始";
    30             }
    31         }

    这是标准的使用后台工作控件的方法,其中的worker_DoWork是后台线程执行的方法,使用worker.ReportProgress();方法可以激发worker_ProgressChanged函数,worker_ProgressChanged是在UI线程执行的,用于修改进度条的进度,在后台线程执行完(或抛出异常或提前取消)后,会激发worker_RunWorkerCompleted函数,对执行完成的任务进行后续整理。

  • 相关阅读:
    【转】快速Redhat AS4和AS5升级至Centos系统
    linux 控制cpu利用率,已经远程访问linux和文件传输
    linux windows启动问题
    Skyline TEP5.1.3二次开发入门——初级(五)
    Skyline TEP5.1.3二次开发入门——初级(四)
    Skyline TEP5.1.3二次开发入门——初级(三)
    Skyline TEP5.1.3二次开发入门——初级(六)
    基于Skyline的TEP5.1.3实现对矢量SHP文件的加载和渲染
    如何在WPF中嵌入Skyline提供的三维控件
    共享一些可以通过网络访问的MPT地址
  • 原文地址:https://www.cnblogs.com/bitzhuwei/p/backgroundworker.html
Copyright © 2011-2022 走看看