2011-04-20 147 views
13

嗨,我已經進入了一些與定時器有關的問題。 希望有人能幫助..從c中的不同線程啓動一個定時器#

  1. 我有一個包含一個按鈕
  2. 當我點擊該按鈕,我開始一個參數化的螺紋
Thread thread1 = new Thread(new ParameterizedThreadStart(execute2)); 
thread1.Start(externalFileParams); 
  1. 代碼Windows窗體裏面的線程執行得非常好
  2. 在這個線程的最後一行我開始一個計時器

public void execute2(Object ob) 
{ 
    if (ob is ExternalFileParams) 
    { 
     if (boolean_variable== true) 
      executeMyMethod();//this also executes very well if condition is true 
     else 
     { 
      timer1.enabled = true; 
      timer1.start(); 
      } 
     } 
    } 
} 

5,但計時器的Tick事件不會觸發

我的工作在VS2008 3.5框架。我從工具箱中拖定時器並設置其Interval 300也試圖設置Enabled真/假 方法是timer1_Tick(Object sender , EventArgs e)但它沒有被解僱

任何人可以提出什麼,我做錯了什麼?

+2

這是最不可能的,這是實現你想要的最好的方式 - 如果你有一個長期運行的任務,需要更新進度的表單,那麼BackgroundWorker是一個很好的方法來做到這一點。如果你需要更多的手動控制,那麼一個池線程(看看ThreadPool.QueueUserWorkItem)比創建你自己的線程要好。 – 2011-04-20 07:58:29

+0

您需要在其主機窗體/控件的線程上調用timer.start,但這是一種尷尬的方式。使用'Control.BeginInvoke'來調用合適的委託。 – Jodrell 2011-04-20 09:01:14

回答

18


你可以嘗試啓動計時器是這樣的:

添加在窗體的構造是:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
// Set the Interval to 1 second. 
aTimer.Interval = 1000; 

添加這個方法到Form 1:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //do something with the timer 
} 

在按鈕單擊事件加入:

aTimer.Enabled = true; 

這個計時器已經線程化了,所以不需要啓動一個新的線程。

3

System.Windows.Forms.Timer在單線程應用程序中工作。

檢查此鏈接:

備註說:

使用定時器在 用戶定義的間隔引發一個事件。此Windows 計時器專爲 單線程環境而設計,其中UI 線程用於執行 處理。它要求用戶 代碼具有可用的UI消息泵 ,並且始終從相同的 線程操作,或將呼叫編組到另一個線程 。

閱讀更多「備註」部分,您會發現Microsoft建議您使用此計時器將其與UI線程同步。

+0

有一個解決方法,看到我的回答 – 321X 2011-04-20 08:57:41

+0

哈哈,讀我的最後一句話(它在那裏一個小時!!):)無論如何謝謝! – 2011-04-20 09:01:38

+0

哈哈:-)我的壞! – 321X 2011-04-20 09:04:04

7

這是MatíasFidemraizer說的。但是,有一個解決方法...

當您的窗體是可調用的(例如狀態欄)的控件時,只需調用它即可!

C#代碼示例:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Thread sampleThread = new Thread(delegate() 
    { 
     // Invoke your control like this 
     this.statusStrip1.Invoke(new MethodInvoker(delegate() 
     { 
      timer1.Start(); 
     })); 
    }); 
    sampleThread.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    MessageBox.Show("I just ticked!"); 
} 
1

我會使用(而不是原料線程)一個BackgroundWorker。主線程將訂閱工作人員的RunWorkerCompleted event:當線程完成時,事件在主線程中觸發。使用此事件處理程序重新啓動計時器。

相關問題