如何挂起和唤醒事件???(100分)

  • 主题发起人 主题发起人 php3
  • 开始时间 开始时间
P

php3

Unregistered / Unconfirmed
GUEST, unregistred user!
一个Button的OnClick事件和一个Timer的OnTimer事件,
(1)OnClick是一个“死”循环
While B_stop.enabledo
begin
......
while flatdo
begin
-------(a)
application.ProcessMessages;
end;
......
flat:=true;
end;
(2)OnTimer事件
if ...... then
begin
flat:=false; -----------(b)
end;
如果用上面的办法实现,会浪费大量的系统资源。
现在问:怎样在(a)处挂起OnClick事件,而在(b)处唤醒它???
注意:由于某些原因,该事件不能随意终止!!!
 
用多线程,然后阻塞主线程
 
阻塞主线程不好,
可以把耗时操作放在另外一个线程中,
用信号量进行同步。
 
SuspendThread() (a)
ResumeThread() (b)
 
不太懂你想干什么,不过下面这两个函数也许对你有用:
MsgWaitForMultiObjects或者MsgWaitForMultiObjectsEx
他们的作用是等待多个操作的完成(就是多个内核对象的状态成为可用),
同时在收到用户消息的时候,例如键盘或者鼠标消息的时候可以返回,不至
于使用户界面因为进行后台操作无法对用户进行响应。
 
OnClick事件是B_stop的吧?我觉得只要把程序稍加修改就可以了。
》(1)OnClick是一个“死”循环
》While B_stop.enabledo
begin
》 ......
ProcA;
》 while flatdo
begin
-------(a)
》 application.ProcessMessages;
》 end;
》 ......
ProcB;
》 flat:=true;
》end;
》(2)OnTimer事件
》if ...... then
begin
》 flat:=false; -----------(b)
》end;

OnClick的作用应该仅是启动,其它的事由OnTimer事件完成:
(1)OnClick事件
ProcA;
Timer1.Enabled:=True;{//设计时设置为False}
(2)OnTimer事件
if ...... then
begin
ProcB;
ProcA;
end;

这样修改以后,运行流程应该没变,不需要原来(a)处的等待了。
 
两个状态没那末复杂把
Button的OnClick事件
将一个全局变量比如blbuttonclick:=true;表示已经click button
当然没有click button是bltuttonclick=false;
而在(2)OnTimer事件
if ...... then
begin
flat:=false; -----------(b)
if flat and blbuttonclick then

begin
//do button oncick things
end;
end;

 
Button的OnClick事件
if flat then
blbuttonclick:=true;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
540
import
I
I
回复
0
查看
599
import
I
后退
顶部