当前位置:主页>仓库管理软件> 列表

时间的问题 找管家婆软件价格

财务软件版1楼: 请看我这段程序:i为循环的次数,ctnu为循环的标志,timer1的interval为1000,为什么我每次循环的次数会相差10000多呢!!!!!!!!!!望各位高手指教!!!!!!!!!!!!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i:integer;
ctnu:bool;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
temp:real;
begin
timer1.Enabled:=true;
ctnu:=true;
while ctnu do
begin
temp:=cos(i);
i:=i+1;
application.ProcessMessages;
end;
edit1.Text:=inttostr(i);
i:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled:=false;
ctnu:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
ctnu:=false;
end;

end.

2楼: 循环次数会大于interval为1000的次数的。就是说i的循环次数跟interval的值是不相等的
你可以这样看看
procedure TForm1.Button1Click(Sender: TObject);
var
temp:real;
begin
timer1.Enabled:=true;
ctnu:=true;
while ctnu do
begin
temp:=cos(i);
i:=i+1;
application.ProcessMessages;
edit1.Text:=inttostr(i);
end;
i:=0;
end; 如金蝶财务软件

3楼: i是循环次数,interval是时间差循环

4楼: application.ProcessMessages;这句语句执行时间差别比较大吧。

5楼: timer的时间也可能没那么精确,你可以把循环放到线程中,


去掉application.ProcessMessages;
再试试看是否是timer定时精度的问题。

6楼: application.ProcessMessages这个语句的执行时间应该不会有太大的误差
怎么样把循环放到线程里去啊|??????????????/

财务软件版7楼: procedure TForm1.FormCreate
加一句
Timer1.enabled:=false
差别就不明显了.

8楼: To:yongshiok
加了你那句话是不怎么明显了,但是为什么回相差几百到几千不等呢????
正常的按理论应相差1到2次才对,为什么会相差那么大呢???????????
望请指教,如果成功了,我会给你加100分!!!!!!!!!!!

9楼: 同意yth ;当TTimer和那个循环同时在主线程中执行时 TTimer的ontime事件的处发不是很精确。

10楼: To yth和osly:那用线程怎么编呢???????????能不能给一下源程序!!!!!!!!!!!!11

11楼: Windows的Timer消息的时间粒度约为53ms,也就是说,即便是相同的interval的值,两次
触发的时间间隔也可能有53ms的差别。你绝对不能指望依靠消息机制来实现精确的Timer。
建议使用高精度的QueryPerformanceCounter API来计算时间,具体请参考1343408以及
2628185号帖子。

12楼: 由于窗体建立时Timer1.enable为真,所以Timer1会执行


当你点击Button1时由于Timer早已经执行.所以计数时间就会比一般的要短.

当窗体建立后,你等稍长时间等Timer1执行完毕.这时不存在Timer先执行的情况,你就发现,每次点击Button1时间相差不大. 如管家婆软件价格

13楼: timer可以看作一个级别低一些的线程,他只有在活动时才计时

财务软件版14楼: Timer1每次执行间隔时间应该相差不大。

上面的详细举例
假取Timer1.Interval为5秒
设定楼主在程序执行后3秒后点击Button1
窗体建立后 Timer1处于激活状态 隔 5秒后会执行Timer1Timer
我们看看楼主 点击button1后执行的代码
timer1.Enabled:=true; // 这句明显不会执行 timer1.Enabled已经为True了,不会再次激活timer1
ctnu:=true;
while ctnu do //会从第4秒开始执行
begin
temp:=cos(i);
i:=i+1;
application.ProcessMessages;
end;
edit1.Text:=inttostr(i);
i:=0;
第5秒后 会触发Timer1Timer 设定ctnu为false 导致循环结束

所以实际第一次 循环所发时间为2秒。

15楼: 一句话说明:TTimer控件本身就是带线程的。由于线程不同步导致各个线程占CPU资源不等,所以,测试时间长了就不准了,用下[red]SYNCHRONIZE[/red]函数再测试看看.

16楼: 为何还不结贴

17楼: 多人接受答案了。