在Visual Control Application中使用延迟(w3_setTimeOut)

时间:2016-01-23 21:17:34

标签: smart-mobile-studio

使用Smart Mobile Studio 2.2.0.4165(测试版)

我不确定我是否正确行事,可能是因为我不理解如何正确使用w3_TimeOut回调。

单击开始按钮时,以下代码会锁定。我的开始按钮卡在向下位置,程序锁定。当我关闭程序时,我得到一个“外部异常”。我必须重新启动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不是阻塞程序 e.g。

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;

1 个答案:

答案 0 :(得分:2)

JavaScript是单线程的,因此只有在程序没有执行任何操作时才会触发计时器。因此,您的事件永远不会被调用,因为您的程序在StartClick内的repeat..until循环中无限期地等待。

您应该重写您的程序,以便:

  • 单击按钮可设置计时器。
  • 在其他时间内执行其他操作。