关键词搜索

源码搜索 ×
×

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

发布2014-05-05浏览3015次

详情内容

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

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

1、进度界面设计效果


2、界面切换效果


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


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


2、关键实现代码片段

2-1、UI界面类

  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Text;
  8. using System.Threading;
  9. using SmartDeviceProjectWtms.Domain;
  10. using SmartDeviceProjectWtms.Repository;
  11. using System.Windows.Forms;
  12. namespace SmartDeviceProjectWtms.Forms
  13. {
  14. public partial class FrmProcessModel : Form
  15. {
  16. public FrmProcessModel()
  17. {
  18. InitializeComponent();
  19. }
  20. // 线程执行业务类型
  21. // 0-钻井任务下载入库,1-质检任务下载入库
  22. public int PROCESS_TYPE { get; set; }
  23. // 线程执行业务数据
  24. private string PROCESS_DATA { get; set; }
  25. // 声明一个委托
  26. private delegate void NewDelegate();
  27. // 创建一个 Service新线程的方法
  28. public void runCurrentThread()
  29. {
  30. Thread thread;
  31. ThreadStart threadstart = new ThreadStart(startCase);
  32. thread = new Thread(threadstart);
  33. thread.Start();
  34. }
  35. // 创建一个 UI新线程的方法
  36. public void runCurrentUIThread()
  37. {
  38. Thread thread;
  39. ThreadStart threadstart = new ThreadStart(startUiCase);
  40. thread = new Thread(threadstart);
  41. thread.Start();
  42. }
  43. // 【UI处理】解决Control.Invoke 必须用于与在独立线程上创建的控件交互
  44. private void startUiCase()
  45. {
  46. if (InvokeRequired)
  47. {
  48. // 要 努力 工作的 方法
  49. BeginInvoke(new NewDelegate(changeUI));
  50. }
  51. }
  52. // 【远程处理】解决Control.Invoke 必须用于与在独立线程上创建的控件交互
  53. private void startCase()
  54. {
  55. if (InvokeRequired)
  56. {
  57. // 要 努力 工作的 方法
  58. if (this.PROCESS_TYPE == 0)
  59. {
  60. BeginInvoke(new NewDelegate(SaveRemoteDrillingTasks));
  61. }
  62. else if (this.PROCESS_TYPE == 1)
  63. {
  64. BeginInvoke(new NewDelegate(SaveRemoteQualityTasks));
  65. }
  66. }
  67. }
  68. /// <summary>
  69. /// 【UI动态改变】随机切换显示图片
  70. /// </summary>
  71. private void doChangePictures()
  72. {
  73. Image imageA = pictureBox0.Image;
  74. Image imageB = pictureBox1.Image;
  75. //实例化随机数产生器random;
  76. Random rad = new Random();
  77. // 生成大于0小于11的随机数
  78. int value = rad.Next(0, 11);
  79. if (value % 2 == 0)
  80. {
  81. pictureBox0.Image = imageA; pictureBox2.Image = imageA;
  82. pictureBox4.Image = imageA; pictureBox6.Image = imageA;
  83. pictureBox1.Image = imageB; pictureBox3.Image = imageB;
  84. pictureBox5.Image = imageB; pictureBox7.Image = imageB;
  85. }
  86. else
  87. {
  88. pictureBox0.Image = imageB; pictureBox2.Image = imageB;
  89. pictureBox4.Image = imageB; pictureBox6.Image = imageB;
  90. pictureBox7.Image = imageA; pictureBox1.Image = imageA;
  91. pictureBox3.Image = imageA; pictureBox5.Image = imageA;
  92. }
  93. }
  94. // 【UI处理显示】改变UI图片循环展示
  95. private void changeUI()
  96. {
  97. int index = 0;
  98. while (Global.QUEST_STATUS && index <= Global.PROCESS_LOOP_COUNT)
  99. {
  100. Thread.Sleep(Global.PROCESS_LOOP_FEQUENCE);
  101. doChangePictures();
  102. Application.DoEvents();
  103. index++;
  104. }
  105. // 关闭此窗口
  106. this.Close();
  107. }
  108. /// <summary>
  109. /// 【UI切换&业务处理】启动并执行相应的操作类型
  110. /// </summary>
  111. public void toStartUI()
  112. {
  113. // 允许发起请求
  114. Global.QUEST_STATUS = true;
  115. // 执行UI线程
  116. this.runCurrentUIThread();
  117. // 执行业务线程
  118. //this.runCurrentThread();
  119. }
  120. /******************************线程处理业务*******************************/
  121. private readonly DrillingTaskRepository drillingTaskDao = new DrillingTaskRepository();
  122. private static QualityTaskRepository qualityTaskDao = new QualityTaskRepository();
  123. /// <summary>
  124. /// 【钻井任务】添加到本地数据库
  125. /// </summary>
  126. /// <returns></returns>
  127. public void SaveRemoteDrillingTasks()
  128. {
  129. //获取服务器任务数据
  130. List<DrillingTaskModel> modelList = RemoteDataService.GetRemoteToLocalDrillingTasksByJson();
  131. if (modelList != null)
  132. {
  133. foreach (DrillingTaskModel model in modelList)
  134. {
  135. if (model != null)
  136. {
  137. // 添加任务到本地暂存SDF数据库
  138. 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);
  139. try
  140. {
  141. drillingTaskDao.AddDrillingTask(task);
  142. }
  143. catch (Exception ex)
  144. {
  145. MessageBox.Show("钻井任务入库异常:" + ex.Message);
  146. continue;
  147. }
  148. // 更新任务状态下载状态
  149. int flag = 1;
  150. flag = RemoteDataService.UpdateDrillingTasksDownloadStatus(task, flag);
  151. if (flag == 0)
  152. {
  153. //更新失败删除本地数据库任务
  154. try
  155. {
  156. drillingTaskDao.DeleteDrillingTaskByTaskId(task.TaskId);
  157. }
  158. catch (Exception ex)
  159. {
  160. MessageBox.Show("本地任务删除异常:" + ex.Message);
  161. continue;
  162. }
  163. }
  164. }
  165. }
  166. }
  167. // 终止线程
  168. Global.QUEST_STATUS = false;
  169. ProcessThread.UN_QUIT_THREAD = false;
  170. }
  171. /// <summary>
  172. /// 【质检任务】添加到本地数据库
  173. /// </summary>
  174. /// <returns></returns>
  175. public void SaveRemoteQualityTasks()
  176. {
  177. //获取服务器任务数据
  178. List<QualityTaskModel> modelList = RemoteDataService.GetRemoteToLocalQualityTasksByJson();
  179. if (modelList != null)
  180. {
  181. foreach (QualityTaskModel model in modelList)
  182. {
  183. if (model != null)
  184. {
  185. // 添加任务到本地暂存SDF数据库
  186. 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);
  187. try
  188. {
  189. qualityTaskDao.AddQualityTask(task);
  190. }
  191. catch (Exception ex)
  192. {
  193. MessageBox.Show("钻井任务入库异常:" + ex.Message);
  194. continue;
  195. }
  196. // 更新任务下载状态
  197. int flag = RemoteDataService.UpdateQualityTasksDownloadStatus(task.TaskId);
  198. if (flag == 0)
  199. {
  200. //更新失败删除本地数据库任务
  201. try
  202. {
  203. qualityTaskDao.DeleteQualityTaskByTaskId(task.TaskId);
  204. }
  205. catch (Exception ex)
  206. {
  207. MessageBox.Show("本地任务删除异常:" + ex.Message);
  208. continue;
  209. }
  210. }
  211. }
  212. }
  213. }
  214. // 终止线程
  215. Global.QUEST_STATUS = false;
  216. ProcessThread.UN_QUIT_THREAD = false;
  217. }
  218. // 窗体活动事件
  219. private void FrmProcessModel_Activated(object sender, EventArgs e)
  220. {
  221. this.toStartUI();
  222. }
  223. /// <summary>
  224. /// 【钻井任务】查询远程数据库任务情况
  225. /// </summary>
  226. public void SearchDrillingList(string queryMeasureNo, string queryWellsNo, int queryProcess)
  227. {
  228. // 执行远程数据访问
  229. Global.TEMP_DATA = RemoteDataService.GetRemoteDrillingTasksJsonByQueryParams(Global.DEVICE_CODE, queryMeasureNo, queryWellsNo, queryProcess);
  230. // 终止线程
  231. Global.QUEST_STATUS = false;
  232. ProcessThread.UN_QUIT_THREAD = false;
  233. }
  234. /// <summary>
  235. /// 【质检任务】查询远程数据库任务情况
  236. /// </summary>
  237. public void SearchQualityList(string queryMeasureNo, string queryWellsNo, int queryProcess)
  238. {
  239. // 执行远程数据访问
  240. Global.TEMP_DATA = RemoteDataService.GetRemoteQualityTasksJsonByQueryParams(Global.DEVICE_CODE, queryMeasureNo, queryWellsNo, queryProcess);
  241. // 终止线程
  242. Global.QUEST_STATUS = false;
  243. ProcessThread.UN_QUIT_THREAD = false;
  244. }
  245. }
  246. }

2-2、UI线程委托

  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Windows.Forms;
  6. using System.Threading;
  7. using SmartDeviceProjectWtms.Forms;
  8. namespace SmartDeviceProjectWtms
  9. {
  10. public class ProcessThread
  11. {
  12. public static bool UN_QUIT_THREAD = true;
  13. private static ProcessThread _instance;
  14. private static readonly Object syncLock = new Object();
  15. public static ProcessThread Instance
  16. {
  17. get
  18. {
  19. if (ProcessThread._instance == null)
  20. {
  21. lock (syncLock)
  22. {
  23. if (ProcessThread._instance == null)
  24. {
  25. ProcessThread._instance = new ProcessThread();
  26. }
  27. }
  28. }
  29. return ProcessThread._instance;
  30. }
  31. }
  32. private ProcessThread()
  33. {
  34. }
  35. private Thread waitingThread;
  36. private FrmProcessModel waitingForm;
  37. public void CreateForm()
  38. {
  39. if (waitingThread != null && waitingForm != null)
  40. {
  41. try
  42. {
  43. waitingThread.Abort();
  44. }
  45. catch (Exception)
  46. {
  47. }
  48. }
  49. waitingThread = new Thread(new ThreadStart(delegate()
  50. {
  51. waitingForm = new FrmProcessModel();
  52. Application.Run(waitingForm);
  53. }));
  54. waitingThread.Start();
  55. }
  56. public FrmProcessModel GetForm()
  57. {
  58. return waitingForm;
  59. }
  60. public void CloseForm()
  61. {
  62. if (waitingThread != null)
  63. {
  64. try
  65. {
  66. waitingThread.Abort();
  67. }
  68. catch (Exception)
  69. {
  70. }
  71. }
  72. }
  73. }
  74. }

2-3、主线程调用

  1. private void funcQualityBtn_Click(object sender, EventArgs e)
  2. {
  3. string message = "";
  4. ProcessThread.UN_QUIT_THREAD = true;
  5. switch (Global.DEVICE_STATUS)
  6. {
  7. case 0:
  8. message = "禁用";
  9. break;
  10. case 1:
  11. // 打开处理进度条
  12. this.operateType = 1;
  13. ProcessThread processThread = ProcessThread.Instance;
  14. processThread.CreateForm();
  15. // 睡眠一会儿等待创建进度显示窗口
  16. Thread.Sleep(300);
  17. // 远程数据处理
  18. while (ProcessThread.UN_QUIT_THREAD)
  19. {
  20. processThread.GetForm().SaveRemoteQualityTasks();
  21. Application.DoEvents();
  22. processThread.CloseForm();
  23. // 打开质检窗口主页
  24. FrmQualityMain frmQualityMain = new FrmQualityMain();
  25. frmQualityMain.Show();
  26. }
  27. return;
  28. case 2:
  29. message = "归还";
  30. break;
  31. case 3:
  32. message = "损坏";
  33. break;
  34. }
  35. MessageBox.Show("设备已【" + message + "】,操作无效!");
  36. }

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


相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载