public void timer_thing()
{
Thread timer = new Thread(new ThreadStart(() =>
{
Thread.Sleep(500);
if (is_mouse_down)
timer1.Enabled = true;
}
));
timer.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//some stuff happens here
}
正如您所见,我希望线程激活计时器。但计时器不会激活。我想这不是正确的方法。或者我错过了一些东西。
答案 0 :(得分:1)
您的帖子没有等待is_mouse_down
事件。它只是在半秒后检查,如果不是时间将不会启用并且胎面关闭。也许你应该尝试使用一个活动?
答案 1 :(得分:1)
当线程命中该指令时,is_mouse_down
可能是false
。该线程不会神奇地等待它转向true
。
然而,您还有另一个更大的问题需要担心。问题是你无法触及工作线程或UI线程以外的任何其他UI元素。这包括System.Windows.Forms.Timer
。随之而来的是各种不确定的混乱。您的应用程序可能无法预测且非常惊人。
我不清楚为什么首先需要一个线程。您是否可以处理Control.MouseDown
事件并在该事件的事件处理程序中启用计时器?这就是我解决问题的方法。
答案 2 :(得分:0)
您可以使用AutoResetEvent从Button Click处理程序自动触发它。
所以在线程中设置:
autoResetEvent.WaitOne();
timer1.Enabled = true;
并在按钮点击处理程序中:
autoResetEvent.Set();
BTW,为什么你不能在Click处理程序中初始化一个Timer?
答案 3 :(得分:0)
文献中描述的这个问题有两个解决方案:
1)积极等待
2)通知
如果你想要主动等待解决方案(实际上是一个过时的解决方案,你的线程应该有while循环)。
如果您想要通知,请在鼠标按下事件处理程序中调用一些启动计时器的方法
答案 4 :(得分:0)
如果您对c#multithreading有疑问,请阅读this文章。它真的很有用,它会向你展示AutoresetEvent,ManualResetEvents,Thread Timers,Timers等。非常好的一般文章。
答案 5 :(得分:0)
当你声明你的计时器对象时,你必须传递timer1_Tick回调。