在视觉控制应用程序中使用延迟 (w3_setTimeOut)
Using a delay (w3_setTimeOut) with Visual Control Application
使用 Smart Mobile Studio 2.2.0.4165(测试版)
我不确定我这样做是否正确,可能是我不明白如何正确使用 w3_TimeOut 回调。
当我单击开始按钮时,以下代码被锁定。我的开始按钮卡在向下位置,程序锁定。当我关闭程序时,我会得到一个 "External Exception"。我必须重新启动 SMS 才能做更多事情。我做错了什么?
procedure TForm1.StartClick(Sender: TObject);
var
i: integer;
begin
//initialize variable
fRunning:= true;
repeat
//get a random light (1-4) and add to array
fLights.Add(RandomInt(4)+1);
//step through lights array and light up each light
for i:= 0 to fLights.Count-1 do
begin
LightUp(fLights[i]);
//add a delay after each
w3_setTimeOut( procedure ()
begin
//shut down light
LightDwn(fLights[i]);
end, 200);
end; //for
until not fRunning;
end;
procedure TForm1.StopClick(Sender: TObject);
begin
//reset variable
fRunning:= false;
//clear all lights in array
fLights.Clear;
end;
I even tried
w3_callback( procedure ()
begin
LightDwn(fLights[i]);
end, 200);
如果我不使用延迟,而是用一个显示消息来延迟它,它也完全符合我的需要(当然,我不能使用显示消息)
procedure TForm1.StartClick(Sender: TObject);
var
i: integer;
begin
//initialize variable
fRunning:= true;
repeat
//get a random light (1-4) and add to array
fLights.Add(RandomInt(4)+1);
//step through lights array and light up each light
for i:= 0 to fLights.Count-1 do
begin
LightUp(fLights[i]);
ShowMessage('Up: ' + intToStr(fLights[i]));
LightDwn(fLights[i]);
ShowMessage('Down: ' + intToStr(fLights[i]));
end; //for
until not fRunning;
end;
一个简单的测试表明 w3_TimeOut 不是阻塞例程
例如
procedure TForm1.W3Button1Click(Sender: TObject);
var
I: Integer;
begin
for I:= 1 to 99 do
begin
w3_setTimeOut( procedure ()
begin
//shut down light
W3Label1.Caption:= IntToStr(I);
end, 1000);
end;
直到循环完成后标签才会更新
我什至尝试刷新表单和标签
w3_setTimeOut( procedure ()
begin
//shut down light
W3Label1.Caption:= IntToStr(I);
W3Label1.Invalidate;
//self.Invalidate;
end, 1000);
但是,我认为我什至没有正确地做到这一点
经过一番搜索,我在SmartCL.Time中找到了TW3EventRepeater。
但是,它的工作方式似乎与 w3_setTimeOut 和 w3_callback
完全一样
如何在一些代码之后执行 wait(),然后在等待到期时执行更多代码。一定是阻塞等待?
谢谢
答案:
fTimer:= TW3Timer.Create;
fTimer.Delay:= 1000;
fTimer.OnTime:= HandleTimer;
fTimer.Enabled:= True;
JavaScript 是 single-threaded,因此计时器仅在您的程序不执行任何操作时触发。因此,您的事件永远不会被调用,因为您的程序在 StartClick
.
内的 repeat..until 循环中无限期等待
您应该重写您的程序以便:
- 点击按钮设置计时器。
- 其他一切都在定时器事件中执行。
使用 Smart Mobile Studio 2.2.0.4165(测试版)
我不确定我这样做是否正确,可能是我不明白如何正确使用 w3_TimeOut 回调。
当我单击开始按钮时,以下代码被锁定。我的开始按钮卡在向下位置,程序锁定。当我关闭程序时,我会得到一个 "External Exception"。我必须重新启动 SMS 才能做更多事情。我做错了什么?
procedure TForm1.StartClick(Sender: TObject);
var
i: integer;
begin
//initialize variable
fRunning:= true;
repeat
//get a random light (1-4) and add to array
fLights.Add(RandomInt(4)+1);
//step through lights array and light up each light
for i:= 0 to fLights.Count-1 do
begin
LightUp(fLights[i]);
//add a delay after each
w3_setTimeOut( procedure ()
begin
//shut down light
LightDwn(fLights[i]);
end, 200);
end; //for
until not fRunning;
end;
procedure TForm1.StopClick(Sender: TObject);
begin
//reset variable
fRunning:= false;
//clear all lights in array
fLights.Clear;
end;
I even tried
w3_callback( procedure ()
begin
LightDwn(fLights[i]);
end, 200);
如果我不使用延迟,而是用一个显示消息来延迟它,它也完全符合我的需要(当然,我不能使用显示消息)
procedure TForm1.StartClick(Sender: TObject);
var
i: integer;
begin
//initialize variable
fRunning:= true;
repeat
//get a random light (1-4) and add to array
fLights.Add(RandomInt(4)+1);
//step through lights array and light up each light
for i:= 0 to fLights.Count-1 do
begin
LightUp(fLights[i]);
ShowMessage('Up: ' + intToStr(fLights[i]));
LightDwn(fLights[i]);
ShowMessage('Down: ' + intToStr(fLights[i]));
end; //for
until not fRunning;
end;
一个简单的测试表明 w3_TimeOut 不是阻塞例程 例如
procedure TForm1.W3Button1Click(Sender: TObject);
var
I: Integer;
begin
for I:= 1 to 99 do
begin
w3_setTimeOut( procedure ()
begin
//shut down light
W3Label1.Caption:= IntToStr(I);
end, 1000);
end;
直到循环完成后标签才会更新
我什至尝试刷新表单和标签
w3_setTimeOut( procedure ()
begin
//shut down light
W3Label1.Caption:= IntToStr(I);
W3Label1.Invalidate;
//self.Invalidate;
end, 1000);
但是,我认为我什至没有正确地做到这一点
经过一番搜索,我在SmartCL.Time中找到了TW3EventRepeater。
但是,它的工作方式似乎与 w3_setTimeOut 和 w3_callback
完全一样如何在一些代码之后执行 wait(),然后在等待到期时执行更多代码。一定是阻塞等待?
谢谢
答案:
fTimer:= TW3Timer.Create;
fTimer.Delay:= 1000;
fTimer.OnTime:= HandleTimer;
fTimer.Enabled:= True;
JavaScript 是 single-threaded,因此计时器仅在您的程序不执行任何操作时触发。因此,您的事件永远不会被调用,因为您的程序在 StartClick
.
您应该重写您的程序以便:
- 点击按钮设置计时器。
- 其他一切都在定时器事件中执行。