C#PDA智能程序图片动态变化进度条设计及实现

前言:SmartProject 项目是C#桌面程序的精简版,很多属性和事件可能都没有设置进SDK中。在最近的PDA程序中,我没用使用进度条。为了防止用户乱点,最开始想使用windows提供的进度条,但是觉得又不适合,所以就试图用图片切换的方式来实现。

 原理:开启线程切换图片实现显示(子线程不影响主线程而继续往下执行)。

1、进度界面设计效果

2、界面切换效果

点击质检按钮后跳转(during the new thread running the UI will be changed):

等待业务线程(任务查询)执行完毕后,关闭进度界面。

2、关键实现代码片段

2-1、UI界面类

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using SmartDeviceProjectWtms.Domain;
using SmartDeviceProjectWtms.Repository;
using System.Windows.Forms;

namespace SmartDeviceProjectWtms.Forms
{
    public partial class FrmProcessModel : Form
    {
        public FrmProcessModel()
        {
            InitializeComponent();
        }

        // 线程执行业务类型

        // 0-钻井任务下载入库,1-质检任务下载入库
        public int PROCESS_TYPE { get; set; }

        // 线程执行业务数据
        private string PROCESS_DATA { get; set; }

        // 声明一个委托
        private delegate void NewDelegate();

        // 创建一个 Service新线程的方法
        public void runCurrentThread()
        {
            Thread thread;
            ThreadStart threadstart = new ThreadStart(startCase);
            thread = new Thread(threadstart);
            thread.Start();
        }

        // 创建一个 UI新线程的方法
        public void runCurrentUIThread()
        {
            Thread thread;
            ThreadStart threadstart = new ThreadStart(startUiCase);
            thread = new Thread(threadstart);
            thread.Start();
        }

        // 【UI处理】解决Control.Invoke 必须用于与在独立线程上创建的控件交互
        private void startUiCase()
        {
            if (InvokeRequired)
            {
                // 要 努力 工作的 方法
                BeginInvoke(new NewDelegate(changeUI));

            }
        }

        // 【远程处理】解决Control.Invoke 必须用于与在独立线程上创建的控件交互
        private void startCase()
        {
            if (InvokeRequired)
            {
                // 要 努力 工作的 方法
                if (this.PROCESS_TYPE == 0)
                {
                    BeginInvoke(new NewDelegate(SaveRemoteDrillingTasks));
                }
                else if (this.PROCESS_TYPE == 1)
                {
                    BeginInvoke(new NewDelegate(SaveRemoteQualityTasks));
                }

            }
        }

        /// <summary>
        /// 【UI动态改变】随机切换显示图片
        /// </summary>
        private void doChangePictures()
        {
            Image imageA = pictureBox0.Image;
            Image imageB = pictureBox1.Image;
            //实例化随机数产生器random;
            Random rad = new Random();
            // 生成大于0小于11的随机数
            int value = rad.Next(0, 11);
            if (value % 2 == 0)
            {
                pictureBox0.Image = imageA; pictureBox2.Image = imageA;
                pictureBox4.Image = imageA; pictureBox6.Image = imageA;
                pictureBox1.Image = imageB; pictureBox3.Image = imageB;
                pictureBox5.Image = imageB; pictureBox7.Image = imageB;
            }
            else
            {
                pictureBox0.Image = imageB; pictureBox2.Image = imageB;
                pictureBox4.Image = imageB; pictureBox6.Image = imageB;
                pictureBox7.Image = imageA; pictureBox1.Image = imageA;
                pictureBox3.Image = imageA; pictureBox5.Image = imageA;
            }
        }

        // 【UI处理显示】改变UI图片循环展示
        private void changeUI()
        {
            int index = 0;
            while (Global.QUEST_STATUS && index <= Global.PROCESS_LOOP_COUNT)
            {
                Thread.Sleep(Global.PROCESS_LOOP_FEQUENCE);
                doChangePictures();
                Application.DoEvents();
                index++;
            }
            // 关闭此窗口
            this.Close();

        }

        /// <summary>
        /// 【UI切换&业务处理】启动并执行相应的操作类型
        /// </summary>
        public void toStartUI()
        {
            // 允许发起请求
            Global.QUEST_STATUS = true;

            // 执行UI线程
            this.runCurrentUIThread();

            // 执行业务线程
            //this.runCurrentThread();

        }

        /******************************线程处理业务*******************************/

        private readonly DrillingTaskRepository drillingTaskDao = new DrillingTaskRepository();

        private static QualityTaskRepository qualityTaskDao = new QualityTaskRepository();

        /// <summary>
        /// 【钻井任务】添加到本地数据库
        /// </summary>
        /// <returns></returns>
        public void SaveRemoteDrillingTasks()
        {
            //获取服务器任务数据
            List<DrillingTaskModel> modelList = RemoteDataService.GetRemoteToLocalDrillingTasksByJson();

            if (modelList != null)
            {
                foreach (DrillingTaskModel model in modelList)
                {
                    if (model != null)
                    {
                        // 添加任务到本地暂存SDF数据库
                        DrillingTask task = new DrillingTask(Convert.ToString(model.id), Convert.ToString(model.projectId), model.measureLineNo, model.wellsNo, model.wellsName, model.wellsLocation, Convert.ToString(model.latlngNorth), Convert.ToString(model.latlngEast), Convert.ToString(model.elevation), model.processStatus, model.planStartDate, model.taskEidtDate, model.captainName, model.areaName, model.projectCode);
                        try
                        {
                            drillingTaskDao.AddDrillingTask(task);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("钻井任务入库异常:" + ex.Message);
                            continue;
                        }
                        // 更新任务状态下载状态
                        int flag = 1;
                        flag = RemoteDataService.UpdateDrillingTasksDownloadStatus(task, flag);
                        if (flag == 0)
                        {
                            //更新失败删除本地数据库任务
                            try
                            {
                                drillingTaskDao.DeleteDrillingTaskByTaskId(task.TaskId);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show("本地任务删除异常:" + ex.Message);
                                continue;
                            }
                        }

                    }
                }
            }
            // 终止线程
            Global.QUEST_STATUS = false;
            ProcessThread.UN_QUIT_THREAD = false;
        }

        /// <summary>
        /// 【质检任务】添加到本地数据库
        /// </summary>
        /// <returns></returns>
        public void SaveRemoteQualityTasks()
        {
            //获取服务器任务数据
            List<QualityTaskModel> modelList = RemoteDataService.GetRemoteToLocalQualityTasksByJson();

            if (modelList != null)
            {
                foreach (QualityTaskModel model in modelList)
                {
                    if (model != null)
                    {
                        // 添加任务到本地暂存SDF数据库
                        QualityTask task = new QualityTask(Convert.ToString(model.id), Convert.ToString(model.projectId), model.measureLineNo, model.wellsNo, model.processStatus, model.planEndDate, model.taskEidtDate, model.checker, model.areaName, model.projectCode);
                        try
                        {
                            qualityTaskDao.AddQualityTask(task);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("钻井任务入库异常:" + ex.Message);
                            continue;
                        }
                        // 更新任务下载状态
                        int flag = RemoteDataService.UpdateQualityTasksDownloadStatus(task.TaskId);
                        if (flag == 0)
                        {
                            //更新失败删除本地数据库任务
                            try
                            {
                                qualityTaskDao.DeleteQualityTaskByTaskId(task.TaskId);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show("本地任务删除异常:" + ex.Message);
                                continue;
                            }
                        }

                    }
                }
            }
            // 终止线程
           Global.QUEST_STATUS = false;
           ProcessThread.UN_QUIT_THREAD = false;
        }

        // 窗体活动事件
        private void FrmProcessModel_Activated(object sender, EventArgs e)
        {
            this.toStartUI();
        }

        /// <summary>
        /// 【钻井任务】查询远程数据库任务情况
        /// </summary>
        public void SearchDrillingList(string queryMeasureNo, string queryWellsNo, int queryProcess)
        {
            // 执行远程数据访问

            Global.TEMP_DATA = RemoteDataService.GetRemoteDrillingTasksJsonByQueryParams(Global.DEVICE_CODE, queryMeasureNo, queryWellsNo, queryProcess);

            // 终止线程

            Global.QUEST_STATUS = false;
            ProcessThread.UN_QUIT_THREAD = false;
        }

        /// <summary>
        /// 【质检任务】查询远程数据库任务情况
        /// </summary>
        public void SearchQualityList(string queryMeasureNo, string queryWellsNo, int queryProcess)
        {
            // 执行远程数据访问

            Global.TEMP_DATA = RemoteDataService.GetRemoteQualityTasksJsonByQueryParams(Global.DEVICE_CODE, queryMeasureNo, queryWellsNo, queryProcess);

            // 终止线程

            Global.QUEST_STATUS = false;
            ProcessThread.UN_QUIT_THREAD = false;
        }
    }
}

2-2、UI线程委托

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using SmartDeviceProjectWtms.Forms;

namespace SmartDeviceProjectWtms
{
    public class ProcessThread
    {
        public static bool UN_QUIT_THREAD = true;

        private static ProcessThread _instance;

        private static readonly Object syncLock = new Object();

        public static ProcessThread Instance
        {
            get
            {
                if (ProcessThread._instance == null)
                {
                    lock (syncLock)
                    {
                        if (ProcessThread._instance == null)
                        {
                            ProcessThread._instance = new ProcessThread();
                        }
                    }
                }
                return ProcessThread._instance;
            }
        }

        private ProcessThread()
        {

        }

        private Thread waitingThread;

        private FrmProcessModel waitingForm;

        public void CreateForm()
        {
            if (waitingThread != null && waitingForm != null)
            {
                try
                {
                    waitingThread.Abort();
                }
                catch (Exception)
                {
                }
            }

            waitingThread = new Thread(new ThreadStart(delegate()
            {
                waitingForm = new FrmProcessModel();
                Application.Run(waitingForm);
            }));
            waitingThread.Start();
        }

        public FrmProcessModel GetForm()
        {
            return waitingForm;
        }

        public void CloseForm()
        {
            if (waitingThread != null)
            {
                try
                {
                    waitingThread.Abort();
                }
                catch (Exception)
                {
                }
            }

        }

    }
}

2-3、主线程调用

  private void funcQualityBtn_Click(object sender, EventArgs e)
        {
            string message = "";
            ProcessThread.UN_QUIT_THREAD = true;
            switch (Global.DEVICE_STATUS)
            {
                case 0:
                    message = "禁用";
                    break;
                case 1:

                    // 打开处理进度条
                    this.operateType = 1;

                    ProcessThread processThread = ProcessThread.Instance;

                    processThread.CreateForm();

                    // 睡眠一会儿等待创建进度显示窗口
                    Thread.Sleep(300);

                    // 远程数据处理
                    while (ProcessThread.UN_QUIT_THREAD)
                    {
                        processThread.GetForm().SaveRemoteQualityTasks();

                        Application.DoEvents();

                        processThread.CloseForm();

                        // 打开质检窗口主页
                        FrmQualityMain frmQualityMain = new FrmQualityMain();
                        frmQualityMain.Show();
                    }
                    return;
                case 2:
                    message = "归还";
                    break;
                case 3:
                    message = "损坏";
                    break;
            }

            MessageBox.Show("设备已【" + message + "】,操作无效!");

        }

注意:调用时Thread.sleep(300);的位置。设置此休眠是因为:在while之前窗体还没有被创建,所以为了防止空引用故设置之。如果将Thread.sleep(300);放在while循环内第一行,webservice就会陷入无休止的循环请求中,所以要放置在外面。

C#PDA智能程序图片动态变化进度条设计及实现

时间: 2025-01-02 15:51:33

C#PDA智能程序图片动态变化进度条设计及实现的相关文章

JS框架_(JQbar.js)柱状图动态百分比进度条特效

柱状图动态百分比进度条效果 <html> <head> <title>jqbar.js柱状图动态百分比进度条特效</title> <link href="css/demo.css" rel="stylesheet" type="text/css" /> <link rel="stylesheet" href="css/jqbar.css" /

AsyncTask的使用 (二)图片下载,进度条

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.Ht

自定义View基础之——图片加载进度条

学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.co

bootstrap-进度条--动态条纹进度条

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>进度条--动态条纹进度条</title>     <!-- 最新版本

你没见过吧?16款形态各异的加载进度条设计

互联网连接越来越快,但难免有一些时刻需要我们等待.在这种情况下,创意的设计师尽力减轻用户等待的痛苦,苦思敏想设计各种创意的进度条(或加载条)效果 ,让用户等待的过程变得更加愉悦. 您可能感兴趣的相关文章 22套 Web & Mobile PSD 用户界面素材 45套精美的手机界面设计素材和设计工具 分享30套精美的Web和手机开发UI素材 60个精美的免费移动开发PSD素材资源 45套新鲜出炉的精美 PSD 网页设计素材 Loading by pearlsomani Flat Loading B

见过吗?14个超有创意的加载进度条设计

所有进度条的功能在于注重细节,即使是最微小的细节可以改变整个用户体验.好的设计能够广泛传播,让人们分享并推荐你的设计.在下面的列表中,你会发现一批设计精美的加载进度条例子,可以免费下载. 您可能感兴趣的相关文章 22套 Web & Mobile PSD 用户界面素材 45套精美的手机界面设计素材和设计工具 分享30套精美的Web和手机开发UI素材 60个精美的免费移动开发PSD素材资源 45套新鲜出炉的精美 PSD 网页设计素材 Loading Bar by Andra Popovici Amo

Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果图: 1.切换图片:      2.彩票转盘 3.图片折叠 4.进度条旋转 5.粒子效果 一.切换图片 看起来很复杂的动画,通过少量的计算和编码就可以简单的实现.要做到这一步,必须是需要研究iOS开发中的Core Animation和Core Graphics框架的.日常工作中,对于很多东西不求甚解

Java Swing程序开发—右下角显示进度条

虽然自己不喜欢Java的GUI程序,但是工作原因,听从上级安排. 转入正题:这篇文章实现在桌面右下角显示一个进度条,显示当前程序运行的进度.而且鼠标能够拖动进度条.有需要的童鞋,可以直接拷贝代码过去使用! Java参考代码: import java.awt.Dimension; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.Mouse

android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

为什么要用异步任务? 在android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作.如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常.所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask. AsyncTask可以在子线程中更新ui,封装简化了异步操作.适用于简单的异步处理.如果多个后台任务时就要使用Handler了