2013-02-01 27 views
0

添加一個for循環中延遲通過下面的代碼(定時器的時間間隔是1000)如何使用定時器

private void timer1_Tick(object sender, EventArgs e) { 
    timer7.Enabled=false; 
    timer8.Enabled=false; 
    lblTimer_Value_InBuildings.Text="0"; 
} 

private void timer2_Tick(object sender, EventArgs e) { 
    lblTimer_Value_InBuildings.Text=(int.Parse(lblTimer_Value_InBuildings.Text)+1).ToString(); 
} 

我們不能在for循環

for(int i=1; i<=Max_Step; i++) { 
    // my code... 

    // I want delay here: 
    timer1.Interval=60000; 
    timer1.Enabled=true; 
    timer2.Enabled=true; 

    // Thread.Sleep(60000); // makes no change even if uncommenting 
} 

創建延遲無論我是否註銷Thread.Sleep(60000);行,我們都沒有看到timer2_Tick中的lblTimer_Value_InBuildings沒有任何變化。

您能否給我一個解決方案(帶或不帶計時器)?

回答

4

你的計時器是你的循環,你不需要for循環。您只需跟蹤函數調用之外的循環變量。我建議將所有這些功能包裝到一個類中,以使其與GUI代碼分開。

private int loopVar = 0; 
public void Form_Load() 
{ 
    // Start 100ms after form load. 
    timer1.Interval = 100; 
    timer1.Enabled = true; 
} 


private void timer1_Tick(object sender, EventArgs e) 
{ 
    timer1.Enabled = false; 
    // My Code Here 
    loopVar++; 

    if (loopVar < Max_Step) 
    { 
     // Come back to the _tick after 60 seconds. 
     timer1.Interval = 60000; 
     timer1.Enabled = true; 

    } 
} 
2

當你做Thread.Sleep(60000)時,你告訴UI線程休眠60秒。這也阻止了定時器的執行,因爲UI線程掛起了睡眠而不是處理諸如定時器睡眠之類的事件。

+0

感謝您的關注兄弟,但這不是一個答案。請用評論替換它! – MoonLight

+1

@MoonLight呃,這顯然是一個答案。而且,他對你所說的錯誤是非常正確的。 –

+1

對不起@MoonLight,下一次我會盡量不告訴你爲什麼你的代碼不工作。我會爲你做所有的工作。 –

1

的代碼完全讓我覺得無聊

方法:

private void timer1_Tick(object sender, EventArgs e) { 
    timer2.Enabled=false; 
    timer1.Enabled=false; 
    lblTimer_Value_InBuildings.Text="0"; 
} 

private void timer2_Tick(object sender, EventArgs e) { 
    lblTimer_Value_InBuildings.Text=(int.Parse(lblTimer_Value_InBuildings.Text)+1).ToString(); 
} 

private void timer3_Tick(object sender, EventArgs e) { 
    if(0!=(int)timer3.Tag) { 
     // your code goes here and peformed per step 
     timer1.Enabled=true; 
     timer2.Enabled=true; 
    } 

    timer3.Tag=(1+(int)timer3.Tag)%Max_Step; 
} 

縮寫:

var delayedInterval=60000; 

timer1.Interval=60000; 
timer2.Interval=1000; 
timer3.Interval=delayedInterval+timer1.Interval; 

lblTimer_Value_InBuildings.Text="0"; 
timer3.Tag=1; 
timer3.Enabled=true; 

原密碼從不timer1timer2停下來,所以我想你應該糾正timer7timer8timer1timer2,否則它們在這裏沒有意義。

+0

我不明白,timer3有什麼好處 - 意味着代碼中的延遲在哪裏? – MoonLight

+0

你的代碼顯示它是一個winform應用程序,也就是說,你的UI線程有一個'SynchronizationContext'。定時器如何工作有點複雜,但是'睡眠'線程只是阻止其他線程期望獲得與它同步的對象。 –