代码Demo:一个用 Observer 模式实现的 Thread 线程文件搜索例子[散分](300分)

  • 主题发起人 主题发起人 zqw0117
  • 开始时间 开始时间
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
常常在 DFW 或我的群里面看到有朋友询问如何制作多线程程序, 以及如何让线程安全的和界面(或者说窗口)通讯的问题. 由于 VCL 框架并不是线程安全的, 所以导致在线程中如果要更新界面显示, 就必须使用 Synchronize 方法来做同步. 可是一旦这样做, 不可避免的就是在线程中需要声明一个没有参数的过程, 把所有数据暂存到线程的私有变量中, 然后用 Synchronize 来调用此过程, 此过程再直接读取线程私有变量, 直接访问窗体类, 或者其它控件来更新界面的显示. 比较典型的例子就是 Delphi 自己的 Demo, 在 Delphi 安装目录下的 Demo/Threads/thrddemo.dpr 文件. 可是该例子仍然有些不太灵活, 如果显示的控件发生改变, TSortThread 的声明也必须随着改变, 并且这个例子还不能实现一个线程同时对多个视图作出更新的功能 比如线程运行中, 窗体上有多个面板, 需要同时显示多种视图效果;
或者有多个选项卡, 用户随时切换到不同标签下就仅更新该选项卡上控件, 类似这样的功能该例子就无法实现了. 而这些功能又是非常常见的, 比如下载软件中, 更新蚂蚁下载点视图(网际快车中就有), 流量视图, 以及 ListView 中下载字节的统计等.
考虑到这些应用, 比较合适的就是 Observer (观察者) 模式, 不仅可以动态的加入/移出观察者, 也能够让线程类 (Core) 和显示类 (UI) 之间脱耦. 可谓一举多得. 于是我就试着写了个线程搜索路径下所有文件的例子, 在其中应用了 Observer 模式.
由于代码说明比较长, 我就把解释都贴在我的博客上了, 欢迎大家去踩踩:
我的Blog: http://blog.sina.com.cn/u/1435615353
一个用 Observer 模式实现的 Thread 线程文件搜索例子(上): http://blog.sina.com.cn/u/5591c079010005pq
一个用 Observer 模式实现的 Thread 线程文件搜索例子(下): http://blog.sina.com.cn/u/5591c079010005pr
例子实际上很简单, 但是可伸缩性和扩展性却比较高. 当然可能也有不足之处. 如果您有任何想法和指教, 请不吝赐教!
这里附一个抓图
http://album.sina.com.cn/pic/5591c07902000ct9
散分!呵呵,源代码已经发到www.2ccc.com上了,可惜需要等待审核,审核好慢哦!!!不过刚刚传到www.delphifans.com上了,已经可以访问了,有兴趣的朋友可以下载下来玩玩:)
http://www.delphifans.com/SoftView/SoftView_2289.html
2ccc.com上的已经可以下载了,地址是:
http://www.2ccc.com/article.asp?articleid=3740
我知道,DFW都是藏龙卧虎的地方,小弟的这个Demo只能当抛砖引玉,希望各位高手多多指教哈!
 
最近做了个三线程的小程序
这东西真不简单
 
怎么将字符型转化为整型啊???
 
>>怎么将字符型转化为整型啊???
不是吧,这个很简单啊,
I := StrToInt('124');
 
看了zqw0117大侠代码,厉害,还可以这么玩线程。
你程序中TSafedObjectList继承自TObjectList从而达到线程安全,但是delphi里提供了一个线程安全的类TThreadList类,不知道大侠为什么不直接使用呢?
看来自己还有很多要学习,还没看到一半就看不下去了!
 
TSavedObjectList很早以前写的,这次就是copy过来了,呵呵,不用ThreadList还基于一种考虑,在以后如果想改用PopList做分发消息的话,也可以修改TSavedObjectList来实现(或者对它进行特殊需求的修改,这样就不会受限于TThreadList了).当然,也可以以后改成TThreadList然后继承子类.这些都是很灵活的,不用太拘泥.
 
要好好 学习
 
好啊!有钱大家挣!
 
楼主,我喜欢界面的皮肤,用什么控件的,说一下,嘿嘿,你的代码是学习的好东西,下载下来,配合你的说明,仔细阅读!
 
搜索速度果然是快,厉害.
 
>>楼主,我喜欢界面的皮肤,用什么控件的,说一下,嘿嘿,你的代码是学习的好东西,下载下来,配合你的说明,仔细阅读!
呵呵,那个是在Vista下运行的效果哦!不是皮肤啦!如果你装一个Vista RC2的话,所有windows程序都是这个效果.呵呵,微软在Vista的UI上的确花费了不少功夫,界面挺好看的.可惜我的显卡不是很高级,无法显示玻璃半透明效果,否则那个抓图更漂亮!!!!
 
楼主你的代码最后还是调用Synchronize(DoDispatch.NotifyObservers),从而调用主窗体的ProcessUpdate方法,不知道这样和写一个窗体更新的方法用Synchronize调用的区别在哪里,效率上会有显著提高吗?
 
效率是一样的,这个代码只是提供了一个框架,利用这个框架,可以用最少的代码解决复杂的功能需求.
 
不错,感谢,下来研究一下
 
很不错的代码!
 
多人接受答案了。
 
后退
顶部