13.4.3.2 使用线程来实现闹钟功能
使用线程来完成上面的闹钟功能也并不麻烦,你去掉上面的Timer控件,将Form类改为下面代码即可:
public partial class Form1 : Form } |
上面的例子运行后效果和使用Timer控件一模一样,要注意代码中注释掉的部分。其中,在窗体加载方法中注释掉了this.threadClock.IsBackground一行代码,该行代码可以将当前线程设置为后台线程。我们提倡在Windows窗体程序中使用后台线程来做一些操作,原因是后台线程在主程序退出时可以自动关闭,如果使用前台线程你必须在窗体结束时自己关闭线程,很多人会忘记这步操作。另外,在线程对应的Timer_Tick方法中我们注释掉了如下两行代码:
Label lblClock = new Label(); |
这两行代码是在线程里创建Label控件,你如果想使用这两行代码,你需要先把窗体中的Label控件删掉或改名。一旦你删掉窗体中的Label控件,使用这两行代码创建控件,在调试运行时会出现下面异常(图13.5):
|
| 图13.5 控件调用异常 |
这个异常是this.Controls.Add方法触发的,说你不能在创建控件之外的线程访问该控件。这个问题我们在介绍Windows窗体控件时并没有介绍,事实上,问题在于Windows窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个Invoke方法来将调用封送到适当的线程。Invoke方法属于控件基类Control的一个方法,用于在拥有此控件的窗口线程上执行指定的委托,使用起来比较麻烦。如上面例子,如果你真想使用线程来生成Label控件和调用Controls的Add方法,那么应该改为下面代码:
public partial class Form1 : Form } |
上面代码中省略的部分和原来一样。在这里,我们为窗体类新添加了一个UpdateTextDelegate委托,该委托是提供给Invoke方法使用的。在调用Invoke方法时使用了InvokeRequired属性来判断当前情况下需不需要使用Invoke方法,此属性的使用可以保证该方法的兼容性,因为有可能本线程的其他方法也需要调用此方法,此时就不需要Invoke方法。要注意Invoke使用的委托还可能带有参数,此时你需要使用下面方式调用带参数的委托:
private void Runtime_SetMessage(string msg) |
关于线程操作Windows窗体的内容我们就介绍到这里。一句话,你可以在窗体中为大量占用资源的任务使用多线程,这样可以保证窗体的正常响应(你可以尝试一下不用线程或Timer来实现上面那个闹钟的例子,可以依靠窗体的刷新事件Paint来实现,你会发现窗体不能正常响应)。另外,如果你在线程中想调用窗体控件的方法不要忘了使用Invoke方法。
| 回书目 上一节 下一节 |
|
· 08年5月软考网管上午真.. · 性能测试从零开始 目录 · 08年5月软考网工上午真.. · 上周拒绝服务攻击(DDo.. · 08年5月各大网上书店及.. · 2008年5月24日软考试题.. |
· 软件设计师专家临考模.. · 上周网络管理员专家自.. · 网络工程师自测获奖名.. · 08年4月各大网上书店及.. · 系统分析师自测获奖名.. · Linux结课考试自测获奖.. |
|
||||
| · Windows Server 2008专.. · 隐私保护技术探讨 · 绿色IT人健康生存手册 · 网络工程师职业规划与.. · 杀毒软件评测专题 · 访问控制列表(ACL)介绍 · Vista SP1对决XP SP3 · 华为员工自杀频频拷问.. |
· 2008中国互联网大会 · 微软出价446亿美元收购.. · 勇闯IT培训黑色围城 · CISSP认证成长之路 · 解析35岁技术人的价值.. · LAMP技术精解 · AMD Phenom三核处理器.. · 充电计划之热门IT认证.. |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · Apache技术专题 · 国际文档格式标准开战 · 路由器设置与口令恢复 |
· PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 · 了解统一威胁管理(UTM).. · 专题:AIX操作系统管理.. · 访问控制列表(ACL)介绍 · 反垃圾邮件技术应用 · ASP.NET 2.0基础开发指.. |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · 三层交换技术专题 · Apache技术专题 · 企业数据恢复指南 · 路由器设置与口令恢复 |
· SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 反垃圾邮件技术应用 · 访问控制列表(ACL)介绍 · PHP开发应用手册 · 专题:AIX操作系统管理.. · 交换机故障解决指南 · 三层交换技术专题 |
|||