2016-01-23 36 views
1

使用智能手機工作室2.2.0.4165(測試版)使用與視覺控制應用的延遲(w3_setTimeOut)

我不知道如果我這樣做的權利,而這可能是因爲我只是不明白怎麼樣正確使用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); 

如果我不使用延遲,而是,還挺有演出消息延遲它,它的工作原理完全一樣,我需要它太(當然,我不能用show消息雖然)

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不是阻塞例程 eg

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

我該怎麼做一些代碼後等待(),然後在等待期滿後,做一些更多的代碼。它一定是阻塞等待?

感謝名單

答:

fTimer:= TW3Timer.Create; 
fTimer.Delay:= 1000; 
fTimer.OnTime:= HandleTimer; 
fTimer.Enabled:= True; 

回答

2

JavaScript是單線程的,所以當你的程序沒有做任何事情都定時器纔會觸發。因此,您的事件永遠不會被調用,因爲您的程序在StartClick內的repeat..until循環中無限期地等待。

  • 點擊一個按鈕設置一個計時器:

    ,這樣你應該重寫你的程式。

  • 在計時器事件內執行其他任何操作。
+0

謝謝!我終於想出瞭如何使用TW3EventRepeater和TW3Timer。我已經用我的解決方案更新了這個問題 – JakeSays

+0

但是,我仍然對知道如何使用以及何時使用以下內容感興趣:w3_SetTimeOut(),w3_ClearInterval(); w3_SetInterval – JakeSays

+0

這些是你想要執行的事情「在一點點」。比如說,proc退出後的幾個ms。像這樣: Procedure TForm1。東西; begin //做某事 w3_callback(procedure() begin showmessage(「done」); end,100); 結束; 在上面,showmessage在w3_callback被調用後100毫秒執行。在通話之間給你一些空氣。 非常適合做清理,或啓用/禁用的東西。 –