2011-04-20 148 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:当线程完成时,事件在主线程中触发。使用此事件处理程序重新启动计时器。

相关问题