如何让delphi等待30秒,然后继续



我试图创建一个无限循环,但我希望循环每30秒运行一次。循环将开始。发生了一堆if语句,一些信息将被更改。循环必须暂停30秒,然后循环将再次开始。这种情况必须永远持续下去。

我正在寻找一种方法来暂停循环30秒,然后继续。任何好的建议都将不胜感激。

编辑#1

程序显示基于日期和时间的"特殊"信息:随着时间的变化,信息也会变化:06:00=math;07:30=生物学。该程序还向您显示下一节课开始前的剩余时间。因此,程序需要连续运行来更新时间,以便它确切地知道它是什么周期,以及到下一个周期还有多少时间。

编辑#2

我想进行"刷新",这样脚本就可以在设定的时间间隔调用脚本,这样它就不会一直运行并吃掉内存。此间隔必须为30秒。

根据您提供更多详细信息的更新,我想我会使用带有计时器的单个线程来提供脉冲来驱动更新。

将计时器间隔设置为您希望对GUI进行更新的任何速率。例如,您可能希望每分钟两次的刷新率,在这种情况下,将计时器间隔设为30*1000

每当计时器启动时,使用当前系统时间计算出需要显示的信息,然后显示该信息。

请注意,此答案不会告诉您如何等待30秒并继续。然而,我怀疑这是解决您实际问题的最简单的方法。

你不想阻止你的程序,因为那样会使UI停止响应。它将阻止您与UI交互,并阻止UI自行绘制。在GUI程序中,不能在主线程中进行阻塞。您应该只阻塞后台线程。但是线程增加了不必要的复杂性。你不想阻止。你不想等。你只需要一个规律的脉冲来驱动更新。计时器。

如果您有阻塞GUI的代码,您可以使用后台线程和事件来提供非阻塞计时器。

创建一个新的Forms应用程序,并在表单上放置一个TMemo组件。本例将在TMemo中添加一条具有当前时间的新行。

主要形式:

unit u_frm_main;
interface
uses
u_workthread,
SysUtils,
Windows,
Forms,
SyncObjs, Classes, Controls, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
Worker : TWorkThread;
procedure ShowData;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ShowData;
begin
// do whatever you need to do here... 
// show current time in memo
Memo1.Lines.Add(FormatDateTime('HH:NN:SS', Now));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// create our worker thread and start it
Worker := TWorkThread.Create(3, ShowData);
Worker.Start;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// signal our worker thread that we are done here
Worker.ThreadEvent.SetEvent;
// terminate and wait
Worker.Terminate;
Worker.WaitFor;
end;
end.

工作线程:

unit u_workthread;
interface
uses
SysUtils,
SyncObjs,
Classes;
type
TWorkProc = procedure of object;
TWorkThread = class(TThread)
private
{ Private declarations }
Counter   : Integer;
FTimeout  : Integer;
FEventProc: TWorkProc;
procedure DoWork;
protected
procedure Execute; override;
public
ThreadEvent : TEvent;
constructor Create(TimeoutSeconds : Integer; EventProc: TWorkProc ); // timeout in seconds
destructor Destroy; override;
end;
implementation
procedure TWorkThread.DoWork;
begin
// put your GUI blocking code in here. Make sure you never call GUI elements from this procedure
//DoSomeLongCalculation();
end;
procedure TWorkThread.Execute;
begin
Counter := 0;
while not Terminated do
begin
if ThreadEvent.WaitFor(FTimeout) = wrTimeout then
begin 
DoWork;
// now inform our main Thread that we have data
Synchronize(FEventProc);
end;
else
// ThreadEvent has been signaled, exit our loop
Break;
end;
end;
constructor TWorkThread.Create(TimeoutSeconds : Integer; EventProc: TWorkProc);
begin
ThreadEvent := TEvent.Create(nil, True, False, '');
// Convert to milliseconds
FTimeout := TimeoutSeconds * 1000;
FEventProc:= EventProc;
// call inherited constructor with CreateSuspended as True
inherited Create(True);
end;
destructor TWorkThread.Destroy;
begin
ThreadEvent.Free;
inherited;
end;

end.

最新更新