Form1中有个5秒定时器,定时器事件代码如下:
var
I: Integer;
begin
tmr1.Enabled:=False;
Caption:='定时器事件执行中...';
try
for I := 0 to 1000 do // Iterate
begin
Sleep(10);
Application.ProcessMessages;
end; // for
finally
tmr1.Enabled:=true;
Caption:='定时器事件执行完毕';
end;
还有个按钮,按钮点击事件中执行Form2.ShowModal(当然要添加Form2,并在Form1中UsesForm2)
好了,下面测试一下:
程序运行后,过5秒即定时器事件处理中,打开Form2后,在关闭Form2正常
如果在启动后5秒内,打开Form2后,再关闭Form2就无法立即关闭了,必须在定时器事件处理完毕后方可正常关闭????????
所以在编写程序中,尽量避免后台程序中长时间执行Application.ProcessMessages。
除此之外,还有一种情况就是没有显式使用此语句而是使用系统功能时,系统默认使用此语句来实现界面的相应:例如以前在程序中使用TIdTime完成了一个定时同步时间,就添加了TIdAntiFreeze组件(内部使用ProcessMessages),使用中由于未连接服务端经常导致窗口无法关闭,无奈只好改写了TIdTime组件,在Connect时指定超时参数为1000(1秒)
写了这些,1是问问如何解决此问题 2 是提醒大家,避免以后出现类似的问题
8 个解决方案
#1
噢
#2
我用了你的代码做实验, 没有发现任何问题,
Application.ProcessMessages;的作用是从消息队列中提取本APPLICATION的消息
然后分发下去,你加这句的意思就是在循环的时候得到消息.
比如我是老板,在打磕睡,但我睡觉之前说了,你们要加班,该干什么就干什么,
所以,我就的工作......
一个道理啊,,我不知道你"如果在启动后5秒内,打开Form2后,再关闭Form2就无法立即关闭了"
有道理吗?一点道理都没有,啊,除非你对在接受到 WM_QUIT 做了控制?
Application.ProcessMessages;的作用是从消息队列中提取本APPLICATION的消息
然后分发下去,你加这句的意思就是在循环的时候得到消息.
比如我是老板,在打磕睡,但我睡觉之前说了,你们要加班,该干什么就干什么,
所以,我就的工作......
一个道理啊,,我不知道你"如果在启动后5秒内,打开Form2后,再关闭Form2就无法立即关闭了"
有道理吗?一点道理都没有,啊,除非你对在接受到 WM_QUIT 做了控制?
#3
给你一个建议,最好不要用application.processmessages;因为它一秒钟可以接收上千条的消息,最好改为线程;
#4
循环里加个全局布尔变量
开始循环时置为真
处理窗口的onclosequery事件,判断变量是否为真,为真则改假,CanClose改假
循环里加入一个判断,变量为假则跳出循环,执行close关闭
开始循环时置为真
处理窗口的onclosequery事件,判断变量是否为真,为真则改假,CanClose改假
循环里加入一个判断,变量为假则跳出循环,执行close关闭
#5
to xjwy(程序春秋) :
修正一下正确的描述是:
"如果在启动后5秒内,打开Form2后,在定时器事件处理中,再关闭Form2就无法立即关闭了"
修正一下正确的描述是:
"如果在启动后5秒内,打开Form2后,在定时器事件处理中,再关闭Form2就无法立即关闭了"
#6
TForm.ShowModal代码中,使用了Application.HandleMessage来处理消息,他和Application.ProcessMessages有什么区别
其他的开发语言如VB VC有此问题吗?
算不算是Bug?
其他的开发语言如VB VC有此问题吗?
算不算是Bug?
#7
不好意思,前面的回答看错主题了
没用过Application.HandleMessage
delphi高手突破中说过,第83页
HandleMessage()方法其实是对ProcessMessage()方法的调用
没用过Application.HandleMessage
delphi高手突破中说过,第83页
HandleMessage()方法其实是对ProcessMessage()方法的调用
#8
帮你顶上去!
#1
噢
#2
我用了你的代码做实验, 没有发现任何问题,
Application.ProcessMessages;的作用是从消息队列中提取本APPLICATION的消息
然后分发下去,你加这句的意思就是在循环的时候得到消息.
比如我是老板,在打磕睡,但我睡觉之前说了,你们要加班,该干什么就干什么,
所以,我就的工作......
一个道理啊,,我不知道你"如果在启动后5秒内,打开Form2后,再关闭Form2就无法立即关闭了"
有道理吗?一点道理都没有,啊,除非你对在接受到 WM_QUIT 做了控制?
Application.ProcessMessages;的作用是从消息队列中提取本APPLICATION的消息
然后分发下去,你加这句的意思就是在循环的时候得到消息.
比如我是老板,在打磕睡,但我睡觉之前说了,你们要加班,该干什么就干什么,
所以,我就的工作......
一个道理啊,,我不知道你"如果在启动后5秒内,打开Form2后,再关闭Form2就无法立即关闭了"
有道理吗?一点道理都没有,啊,除非你对在接受到 WM_QUIT 做了控制?
#3
给你一个建议,最好不要用application.processmessages;因为它一秒钟可以接收上千条的消息,最好改为线程;
#4
循环里加个全局布尔变量
开始循环时置为真
处理窗口的onclosequery事件,判断变量是否为真,为真则改假,CanClose改假
循环里加入一个判断,变量为假则跳出循环,执行close关闭
开始循环时置为真
处理窗口的onclosequery事件,判断变量是否为真,为真则改假,CanClose改假
循环里加入一个判断,变量为假则跳出循环,执行close关闭
#5
to xjwy(程序春秋) :
修正一下正确的描述是:
"如果在启动后5秒内,打开Form2后,在定时器事件处理中,再关闭Form2就无法立即关闭了"
修正一下正确的描述是:
"如果在启动后5秒内,打开Form2后,在定时器事件处理中,再关闭Form2就无法立即关闭了"
#6
TForm.ShowModal代码中,使用了Application.HandleMessage来处理消息,他和Application.ProcessMessages有什么区别
其他的开发语言如VB VC有此问题吗?
算不算是Bug?
其他的开发语言如VB VC有此问题吗?
算不算是Bug?
#7
不好意思,前面的回答看错主题了
没用过Application.HandleMessage
delphi高手突破中说过,第83页
HandleMessage()方法其实是对ProcessMessage()方法的调用
没用过Application.HandleMessage
delphi高手突破中说过,第83页
HandleMessage()方法其实是对ProcessMessage()方法的调用
#8
帮你顶上去!