假设我写信button1click事件处理程序,其被调用时(即,当按钮1点击)不断加1到可变计数器的事件处理程序交换消息(一个或多个):如何使与其他事件处理程序(一个或多个)
var
i : counter;
begin
while 1 = 1 do
inc(i);
end;
现在我想在我的表单上添加另一个按钮并将其命名为“stop”,它会突然退出 button1click(在其调用之后)或停止将它添加到计数器,我该怎么做?
假设我写信button1click事件处理程序,其被调用时(即,当按钮1点击)不断加1到可变计数器的事件处理程序交换消息(一个或多个):如何使与其他事件处理程序(一个或多个)
var
i : counter;
begin
while 1 = 1 do
inc(i);
end;
现在我想在我的表单上添加另一个按钮并将其命名为“stop”,它会突然退出 button1click(在其调用之后)或停止将它添加到计数器,我该怎么做?
希望这将提供一些想法,如何适应基于定时器的方式满足您的需求:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer; // with Interval = 1 (for example) and Enabled = FALSE
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Execute(Sender: TObject);
private
fCounter: Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := TRUE;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := FALSE;
end;
procedure TForm1.Timer1Execute(Sender: TObject);
begin
Inc(fCounter);
end;
如果你的需求是更复杂的那么一个基于TThread类方法可能更合适。但无论你做什么,都不要求助于Application.ProcessMessages它只会令你痛苦!
Application.ProcessMessages
里面。这允许其他控件处理和响应事件。但是,这样做并不是很好的做法。你在表单中做的所有事情都应该回应一些事件,所以如果你想做一些周期性的事情,你应该使用一个Timer或类似的东西。
+1提到TTimer,这是正确的方式来做到这一点。 – 2010-06-22 12:04:37
感谢您的答案FrantišekŽiačik。我不是真的要使用一个while循环这仅仅是为了问我实际上我试图让一个下载经理暂停/恢复支持的想法是,每当我按下暂停按钮我的下载暂停 – 2010-06-23 06:07:11
对于这种情况下,你应该看看在线程或异步请求中,这对于这类工作来说是一个更好的方法。 – 2010-06-23 08:20:31
你可以把你的时间放在一个单独的线程。简单的TThread就足够了,但也有特殊的线程库,如AsyncCalls或OmniThreadLibrary。
感谢您的答案torbins。这是更好的tthred,asyncccalls或omnithredlibrary和我不知道太多的线程,以便哪个这些你会更容易成为一个开始 – 2010-06-23 05:56:42
我认为你可以从TThread开始。一些很好的文章可以在这里找到:http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/ToC.html – Torbins 2010-06-23 06:46:00
谢谢你的答案。 1. Application.ProcessMessages有什么问题? 2.我真的不会使用一个while循环这仅仅是为了询问其实我试图让一个下载管理器暂停继续支持的想法是,只要我按下暂停按钮我的下载暂停 – 2010-06-23 06:04:22
当你调用Application.ProcessMessage( APM),您可以在应用程序中有效地创建新的消息循环。直到没有更多的消息需要处理,并且如果其中一条消息是应用程序中某个其他按钮或窗口中的CLICK,则控制权直接从无辜的APM调用传递到该消息事件处理程序。在坚果壳中,您在应用程序中的VCL代码中创建了潜在的重入问题(除非您在调用APM时尽量禁用您的UI以防止出现这种情况)。...继续 – Deltics 2010-06-23 07:12:41
绝大多数使用我遇到的APM是允许GUI更新在一些进程正在进行时发生,即处理画图消息。在VCL中,这是不必要的 - 您可以通过显式调用Update来明确重新绘制所需的控件(通常是标签,状态栏等内容),从而在该处理期间根据需要更新UI。通常可以使用定时器(如本例中)或线程来避免APM被调用的其他场景。 – Deltics 2010-06-23 07:15:10