捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:一个用 Observer 模式实现的 Thread 线程文件搜索例子
winglion 31692 2007/11/7 15:27:13
谢谢阿飞
hwwlt 27028 2006/11/7 9:04:41
真心谢谢楼主
victorwoo 27024 2006/11/6 21:42:26
没有啊。比如说你用share deny all方式打开一个文件,这个时候别的进程不能打开此文件了,所以要尽早把这个文件关闭了好。如果这个时候打开文件的线程是超低优先级的,慢慢吞吞才结束,整个系统就感觉拖慢了。
upp 27022 2006/11/6 19:13:26
要提高IO的访问速度,那只能是换硬件了。呵呵。
victorwoo 27017 2006/11/6 14:28:59
嗯,记下这招。
不过我在想一个问题:如果一个线程需要进行大量的IO,例如杀毒软件,那么降低优先级可能会造成IO操作迟缓。其他线程由于IO锁定可能得不到资源。我降低eMule/诺顿的优先级,并没有感觉到系统变快很多。
upp 27016 2006/11/6 14:02:45
是的,因为搜索在repeat里面,所以占用CPU几乎90%以上。我的线程不存在销毁创建的问题,因为生存期就是Searching之间,完成后自行销毁了,下次Search的时候再次创建。所以,victorwoo兄,CPU占用的情况是后者(线程运行的时候导致CPU占用)。

因为本身就是线程,而且可以设置优先级,所以不用太在意这个CPU的占用,一旦有程序需要CPU执行其它高优先级的任务的时候,系统会把更多时间分配给高优先级的程序使用,这个大可不必担心。

不过也有很简单的方法用手工让出CPU时间去处理其它事情,就是在TThreadFileSearch.OnSearch方法中,加一句Sleep(20)即可,这样可将CPU占用降低80%左右(占用平均在20%左右)

procedure TThreadFileSearch.OnSearch(Sender: TObject; const BaseDir: string;
  const FoundRec: TSearchRec);
var
  DoDispatch: TFileFoundSubjectDispatcher;
begin
  if not Terminated then
  begin
    DoDispatch := FUpdateSubjectDispatcher;
    if DoDispatch <> nil then
    begin
      DoDispatch.SearchFoundInfo := FoundRec;
      with DoDispatch.SearchFoundInfo do
      begin
        Directory := BaseDir;
        FullPathName := BaseDir + FoundRec.Name;
      end;
      DispatchNotification(fdsSearching);
      Sleep(20);
    end;
  end
  else
    FFileSearch.Abort;
end;
victorwoo 27007 2006/11/6 9:24:46
占用CPU过高,需要观察是由于创建/销毁线程的时候导致CPU占用,还是线程运行的时候导致CPU占用。如果是后者,那么是正常的(需要和传统方法比较一下)。
当然,如果进一步研究这个问题的话可以用到线程池。Indy中有这个东西,不过一直搞不懂怎么用。
st52 27003 2006/11/6 3:09:11
不错```学到不少多东西```就是此例CPU暂用CPU过高一点``
msm2008 26932 2006/10/31 23:01:44
多线程经常做,但因为经验不足有时会出现内存泄漏.楼主做出这样的例子值得我们学习,书本是难以看到的东西,真是非常感谢楼主!
dfoversky 26879 2006/10/27 23:12:25
辛苦啦 谢谢
doorkey 26872 2006/10/27 16:03:58
非常赞成 victorwoo 的看法。随着CPU技术真正多核化,我也一直想写一个比较实用的多线程类,upp的代码很好理解,非常值得研究和扩展。
感谢upp的无私奉献。
victorwoo 26861 2006/10/27 10:17:20
呵呵,这个就是Design Pattern的魅力。我是赞成楼主的做法的。
Design Pattern的优势就在于:通过吸取前人成功的经验来达到进步,而不是通过总结自己的失败来达到进步。
利用DP来写代码(实际上应该叫做“构建”),是一种固定套路,一招一式都是经过前人总结的。虽然修炼起来比较麻烦,但一旦练成就如行云流水,代码优美且易于维护。更何况现在支持DP的建模工具如雨后春笋。
upp 26860 2006/10/27 9:58:05
楼上的兄弟说的没错,普通的应用SendMessage就可以了,复杂一点的结构,用WM_COPYDATA也行.只是释放起来会比较麻烦,进程如果丢失了某个Message的响应,则会留下内存泄漏.话虽如此,不过SendMessage也是一个不错的应用方式,而且代码量也很简单.

我的这个例子不失为一种第二条通向罗马的路,给大家更多思路来思考自己的应用.至于究竟使用什么方法,还是看大家的习惯,用的顺手就好:)
mmzmagic 26857 2006/10/27 9:40:38
呵呵 我也经常碰到界面同步的问题。
感谢作者的辛勤劳动和崇高的共享精神,不过我觉得这样做太麻烦:),
编写程序需要具备快速方便,写的过于复杂不容易编写、阅读和维护。
我现在一般用自定义消息 线程用PostMessage通知主线程更新界面,又或是主线程定时去读取线程里的信息来显示。方便省事LOL.
只是个人意见并无任何反对作者观点的意思。
scottrayn 26856 2006/10/27 8:15:21
正在学多线程,感觉书上讲的不是非常简单,一笔带过,有的书甚至提了一下就应付了事,具体实战的东西更是没有,谢谢盒子和所有有共享精神和行动的人,不论你在地球的那一角:)
swgame 26849 2006/10/26 20:52:57
OK,下来看看.辛苦您了
第一页 上一页 下一页 最后页 有 16 条纪录 共1页 1 - 16
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表