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,下来看看.辛苦您了 |