关于多线程和Timer的问题(100分)

  • 主题发起人 firstrose
  • 开始时间
你何不把所有与图像解压有关的代码全部封装到一个线程中,解压的结果放到共用缓冲区内。解压一帧完成后,通知主线程更新到界面上,岂不更好。
要从根据本上解决CPU占用问题,最好是从解压算法上找原因,CPU只有一个,不论你把解压代码放封装在什么地方,总是需要足够的处理能力完成你的工作;当然,做成后台解压后,在双CPU或超线程模式下又是另一回事了。
 
是啊,就是封装了的。只不过你说的public buffer在我程序里是用queue实现的。
算法?就是调用M$的Divx啊
 
看来楼主首先需要搞清楚线程什么时候结束。
当TThread.Execute结束后整个线程就结束了。
所以想要线程一直存在并且能被主进程控制,你必须在Execute中使用无限循环,而循环的退出条件就是terminated.
至于cpu 100% 的问题, 好像没有规定在循环中不能调用sleep或者waitforxxx强制交出线程剩余时间片而转入后台并等待吧?
 
楼主:没仔细看你的代码,不过说实话,既然用线程了,干吗还要用Timer,Timer这个东西
并不一定好用,你完全可以在线程里进行控制。
另外,你说用线程while后cpu占用就是100%,这偶不敢赞同,照你的说法,一旦这个线程
被调用后,cpu就忙的不得了了,别的程序也就不用执行了,可是我用线程就是为了让它在
后台执行,而我前台可以该干什么就干什么,所以可以肯定,这个cpu被100%占用了,应该
不是因为使用了线程的问题,而是可能你的功能代码的问题,或者是你的线程使用不当的
问题,因为我用的线程打开后就一直执行,可是对其他的任何程序没有任何影响,也看不出
cpu快被累死的感觉,所以,我建议你还是仔细调试一下,看看到底是什么地方有问题,占
用cpu比较多,你就可以从那里下手来解决问题。
 
CPU占用过高是因为你的程序在不停的进行事务处理,但可能大部分是无用的,可以在线程的事务处理结束,而准备进入下一个事务处理循环之前加入以下代码解决:
Sleep(100);
或:
Application->ProcessMessages;
这样CPU占用就可以降下来了,就这样:
while not Terminateddo
begin
// 你的事务处理代码写在这里……
Sleep(100);
end;
 
不明白?即然用了timer为什么不直接把线程的execute写在timer的ontimer里呢?
 
to firstrose:
一般来说,While循环对于的CPU占用率的确是100%,但是那只能说明你处理不好,喝喝.
你可以在线程的While循环里面把线程睡眠,然后再需要再执行线程的时候唤醒,唤醒之后循环会进行下一次.
睡着了的线程会占用100%的CPU使用率吗?
线程的Execute方法一般来说是不用手工去调用的,如果需要的话,则不必要定义线程了(事实上线程的作用已经没有了,因为Execute只不过是主线程中调用的一个对象的方法而已,它还是在主线程中执行的).
 
我同意上面说的”While循环对于的CPU占用率的确是100%,但是那只能说明你处理不好“的观点。当然也有可能根本是你对线程的理解有问题。作为一个子线程它要做的只是一个后台的辅助处理过程,不会对你的主线程产生影响。当while循环会占用你的cpu过多时候,可以在循环中使用sleep,Application.ProcessMessages等函数交出Cpu的方法来做的一种平衡。另外在Timer里面触发子线程也是不可取的,如果因为何种原因你的线程处理超过了40秒,那么这是是否会有两个线程存在,这又会出现何种现象呢。
 
firstrose:
呵呵.这么多同志支持我了!.
>>你说..
>>但为节省资源,我的线程里没有while,resume一次就结束了。
>>下次执行用resume就不对了吧?
我再次重申 ?? 线程占资源吗?
我认为主要是工作的内容占资源
另外你说不用 while ...
创建一个线程,然后销毁一个线程不需要系统的开销吗?
而且很明显你要经常创建线程完成任务对吧,这额外的开销不是要浪费的吗?

另: 你的回复..
>>itren:
>> 如果用while,就是轮询。以1秒为例,等于是1秒的时间全部工作,但用timer的话,
>>1秒触发25次,每次执行时间在不超过40毫秒时,假定为30毫秒,工作时间就是750毫秒。
>>难道750毫秒不比1秒少吗?????
>>所以省资源!另外你实验一下就知道,用while的cpu占用率为100%,而timer就七,八
>>十。
你以为 windows真的支持多线程吗? CPU是模拟出来的多线程而已. timer是多线程的吗?
不是呀,
>>希望你在发言前先把问题弄清楚。
这句话似乎应该我说吧... 我说真正占资源的是线程的工作内容,这没错吧..?? 你怎么乱下结论呢.希望你谦虚一点,好不好!
 
to itren:
Timer的确是多线程;只不过是Windows中的一种特殊的时钟线程,如果你用过SetTimer和KillTimer两个API函数就知道的,Timer只不过是对这两个函数进行封装了而已.
当然,如果认为Windows不是真的支持多线程的话,就另当别论了.
 
To aizb:
用Timer算不上多线程,它借助了操作系统的时钟线程,但对目标应用程序来说还是单线程的,它是通过给主窗口PostMessage让主窗口来处理消息,在当前的timer消息未处理完前是不会有其它的timer消息得到执行。
To: 楼主
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
VDC.Execute;
end;
你这样写只不过调用了一个普通的函数,是属于主调形式,没有达到分享CPU的目的。用线程的话,Execute 其实是一个回调函数,由操作系统来调用,操作系统维护着线程的调度和cpu时间片转换,它负责调用回调函数,从而提高当前进程的CPU使用时间,让你感到程序快了。
我分析你的程序为什么CPU占用80%,可能是因为你的Execute函数的效率问题,它里面的数据处理方法“压缩/解压缩”占用CPU资源。
你应该调用resume等函数来启动线程,才能真正的把线程交给操作系统来管理。否则你的“多线程”永远是单线程。你再降低线程的优先级,这样就可以降低CPU的使用率了
 
有人在吗?我想问一下在一个线里怎么使用timer,使用timer的触发,最好给我一些代码?
 
顶部