把控制权交回系统的sleep()是什么? (100分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中用到下面代码:
; ; ; ; ; ; for j:=0 to 10 do begin
; ; ; ; ; ; ; ; application.ProcessMessages;
; ; ; ; ; ; ; ; sleep(1000);
; ; ; ; ; ; ; ; application.ProcessMessages;
; ; ; ; ; ; end;
但是,我发现在sleep的过程中,连鼠标动作都被影响了,究竟把控制权交回系统的sleep()
是什么?或者说怎么可以sleep()后,还可以拖放我的主Form?
 
那是一个用于延时的API
 
you can use another thread.
 
一般用sleep(0)来放弃当前线程的时间片.
 
但是,不断地用
application.ProcessMessages;
会使程序占用的CPU资源达到99%啊!
怎么把这东西降下来?
 
application.ProcessMessages;本來是轉移系統控制權的﹐你不停的調用就是讓系統不停的
轉移﹐當然會戰用CPU。Sleep是延時函數﹐讓你的程序暫停多久。
 
同意dadabox
;只要去掉第二个application.processmessage就行了
 
sleep是把进程的当前线程挂起一段时间。如果你只有一个主线程在运行,
那么你执行sleep的时候,当然不能作其他的操作了,因为已经被挂起了。
你可以把你的操作放在一个Timer中来执行。
 
问题是我的程序某控件某过程A要暂停,等待该控件的OnRead事件的触发,该过程A马上作出响应。
怎么可以用不占资源的方法实现啊?
如果把该线程挂起,线程某控件的OnRead事件还会被触发吗?
是否可以在OnRead事件中唤醒该线程?
 
你能不能改进你的过程A,不要暂停(或借助全局变量来记录),这个过程只干这过程的事,
至于连续性,用全局变量来保持
 
procedure Delay(MSecs: Longint);
var
; start,Now: Longint;
begin
; start:=GetTickCount;
; repeat
; ; Application.ProcessMessages;
; ; Now:=GetTickCount;
; until(Now-start>=MSecs) or (Now<start);
end;
 
将过程A加入到该控件的OnRead事件中即可!
倒~~~,老兄怎么把sleep也玩出来了?
 
接受答案了.
 
后退
顶部