一 ZIP接压缩
实现一个解压缩程序,可以吧zip文件解压缩到指定目录。
相关技术:
① ZIP解压缩的API;
② 工作进程;
③ 进度条控件的使用;
二 界面流程
拷贝粘贴,是软件工程师的日常操作。
API太多,是不能全记住的,只需要记住位置。用到的时候拷贝粘贴过来,再稍微修改即可。
三 定时任务
定时任务:定时的,周期性执行的任务。
例如:每3秒刷新一次显示,每5秒自动保存数据。
定时任务的实现方式:
① 创建工作线程,sleep控制时间间隔;
② 创建定时器:
System.Timers.Timer(基于线程池);
System.Threading.Timer(基于线程池);
System.Windows.Forms.Timer(基于消息循环);
1 使用线程定时器
System.Threading.Timer 一个基于线程池的定时器。
① 创建定时器;
② 启动定时器/停止定时器;
③ 在定时器回调中,执行定时任务;
(回调在工作线程中执行的)
④ 窗口关闭时,销毁定时器;
以下实例:button控件、textbox控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 定时任务
{
public partial class Form1 : Form
{
System.Threading.Timer timer;
int count = 5;
public Form1()
{
InitializeComponent();
//创建定时器
//dueTime为-1,表示禁用
timer = new System.Threading.Timer(
new TimerCallback(this.OnTimer)
, null
, -1
, -1);
}
//点击开始是,启动定时器
private void startBtn_Click(object sender, EventArgs e)
{
count = 5;
ShowCount();
timer.Change(1000, 1000);
}
//点击停止时,停止定时器
private void stopBtn_Click(object sender, EventArgs e)
{
timer.Change(-1, -1);
}
//窗口关闭时,销毁定时器
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
timer.Dispose();
}
//此定时器回调在工作线程(线程池)中调用
private void OnTimer(object state)
{
count--;
ShowCount();//在工作线程中不能直接操纵UI控件
if(count<=0)
{
timer.Change(-1, -1);//停止定时器
return;
}
}
private void ShowCount()
{
if(this.InvokeRequired)
{
this.Invoke(new Action(this.ShowCount));
return;
}
this.countLabel.Text = count + "";
}
}
}
注意:此定时器是基于线程池,回调在工作线程中执行不能直接更新UI;
四 界面定时器
System.Windows.Forms.Timer一个基于消息的定时器:
① 创建定时器;
② 启动定时器/停止定时器;
③ 定时器的回调,在消息循环中执行(可以直接更新UI控件/必须尽快返回);
④ 销毁定时器;
1 要点与细节
① 界面定时器的好处:可以直接更新UI控件;
② 界面定时器的局限:只适合执行轻量级任务,必须尽快完成,不然界面会卡顿;
对于重量级的定时任务,须使用线程定时器;
五 模拟时钟
① 绘制:表盘;
② 绘制:时针、分针、秒值;
③ 定时器:每秒钟重绘制一次;
1 要点与细节
① 控件的销毁
Control 对象会随着父窗口的销毁二销毁,可以在控件销毁时,一并销毁Timer对象;
模拟时钟.rar: https://url09.ctfile.com/f/22158009-739234274-34012d?p=5939 (访问密码: 5939)