关于TTimer 控件
来源:互联网 发布:delphi是不是编程语言 编辑:程序博客网 时间:2024/06/05 17:33
近期写程序时用了TTimer控件,执行的代码如下:
var
pexe : pexetype;
i,j : integer;
url,ss : string;
begin
for i := 0 to monlist.Count - 1 do
begin
pexe := monlist[i];
if pexe.otherInfo = 0 then
continue;
url := 'http://localhost:' + inttostr(pexe.otherInfo) + '/test.php';
ss := '';
try
ss := idhttp1.Get(url);
except
sleep(1000);
if idhttp1.IOHandler <> nil then
idhttp1.IOHandler.Close;
try
ss := idhttp1.Get(url);
except
mysleep(1000);
if idhttp1.IOHandler <> nil then
idhttp1.IOHandler.Close;
try
ss := idhttp1.Get(url);
except
ss := '';
end;
end;
end;
if trim(ss) <> 'ok' then
begin
pexe.otherInfo := 0;
TMon.KillTask(pexe.pid);
log.log('killtask:'+pexe.path);
end;
end;
为了防止程序在sleep(1000)时处于假死状态,我把sleep(1000)用函数mysleep来代替,把1秒分解也10份,代码如下:
procedure mysleep(sec: integer);
var
i,j : integer;
begin
for i := 0 to sec - 1 do
begin
for j := 0 to 9 do
begin
sleep(100);
application.ProcessMessages;(让界面响应其他消息,如重画之类的,防止界面假死)
end;
end;
end;
问题就出来了,运行程序,一到mysleep(1) ,程序就不往下走了,又重新从Timer1Timer函数开始执行。为什么会这样,百思不得其解,后面看了TTimer的原码,才发现:
procedure TTimer.WndProc(var Msg: TMessage);
begin
with Msg do
if Msg = WM_TIMER then
try
Timer;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
对delphi而言,TTimer控件实际是一个消息定时发送器,每隔一个Interval就会定时发送类似WM_TIMER 的消息,当程序分发并获取这个消息时,就会处理Timer1Timer的事件。
那么原因找到了。application.ProcessMessages;这个函数是让程序处理其他消息,这样程序又从头开始了。
包括 indy 组件里的IdAntiFreeze控件也是通过application.ProcessMessages来实现的,所以如果Timer事件里有用到indy系列控件时,可能会出问题,如idhttp控件,在timer里用了,就不能放IdAntiFreeze控件了。
一般情况下,application.ProcessMessages 这个函数尽量要少用,因为他会影响消息的处理流程。如果要防止界面出现顿卡,最好的解决方法是用多线程来实现,把耗时的工作放到其他线程里来实现,而不全用来主线程里。
- 关于TTimer 控件
- delphi 定时器的简单应用-TTimer控件
- ttimer 控件和 application.processmessages 导致的消息列表溢出。
- TTimer内部工作原理
- 关于控件
- 关于TreeView控件专题
- 关于TreeView控件专题
- 关于验证控件
- 关于TreeView控件专题
- 关于TreeView控件
- 关于TreeView控件专题
- 关于TreeView控件专题
- 关于RequireFieldValidator控件
- 关于TreeView控件专题
- 关于TreeView控件专题
- 关于TreeView控件
- 关于MSComm控件介绍
- 关于HtmlForm控件
- iOS开发19:Navigation Bar的简单设置
- 异常崩溃码对照
- Tomcat会话超时的配置
- 解决tomcat启动时无法找到GroovyObject 异常
- asp.net 转换人民币方法
- 关于TTimer 控件
- Tomcat会话超时
- 什么是云计算?为什么需要云?
- (转)WINDOWS XP开启telnet服务
- Resin 配置连接池
- Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
- RMAN备份恢复之BLOCKRECOVER
- 自己的 「 代码制造 check list 」
- 二分法插入排序