【问题标题】:why windows forms timer stopped working?为什么 Windows 窗体计时器停止工作?
【发布时间】:2013-05-27 04:29:58
【问题描述】:

在我的基于 C# 的应用程序中,我在我的应用程序中创建了一个具有自己的 System.Forms.Timer 对象的新表单。第一次创建表单时一切正常,我收到计时器滴答声,没有问题。在某些情况下,我必须终止表单并创建一个新的(相同的)表单对象。表单以类似的方式创建。表单已正确加载,计时器已正确初始化但计时器不打勾。我尝试了不同的方法,例如停止和处理计时器对象并在 FormLoad 中创建一个新对象,但徒劳无功。我的朋友建议我的新表单对象可能没有收到 Windows 计时器消息 (WM_TIMER)。如何检查消息循环在我的新表单对象中是否正常工作?我做错了什么?

简而言之,重新创建表单对象会以某种方式禁用计时器滴答。请指教。

代码充满了反射并散开。我会尽量发帖。

创建新表单对象的代码

Form f = ReflectUtils.CreateClassFromAssembly( _TheAssembly, FormName ) as Form;
if ( null == f )
{
    throw new ApplicationException( "Failed to create Form: {");
}
_GUICancelEventHandler = new CancelEventHandler( GUIControlForm_Cancel );
f.Closing += _GUICancelEventHandler;

f.Show();

销毁表单的代码

f.Close();
f.Dispose();

应用程序使用相同的代码来创建新的表单对象。

定时器的设计器代码

this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Interval = 500;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

在 formLoad 事件中

timer1.Start();

希望这会有所帮助。

【问题讨论】:

  • 请出示您目前拥有的代码。
  • 我已经添加了代码。由于它的实施,我不确定它会有多大帮助。我想我只是想了解 Windows 窗体计时器的一般行为,如果有一些明显的东西我错过了。

标签: c# winforms


【解决方案1】:

如果你要杀死你的表单,最好让计时器独立于你的表单实例。

我建议,

不要在表单中使用计时器,而是在单独的类中维护计时器,这样它就不会与您要杀死的表单一起处理。

使用该类的对象访问计时器(启动、停止、重置、处理事件)。

【讨论】:

  • 谢谢。我想我可以用System.Timers.Timer 类对象替换我的表单计时器。会试试看。
  • @Alok 不仅仅是替换,而是正如 Bharath 所说,将其移到自己的类中以单独实例化。如果它还在表单中,它会随着表单而死。
  • 只要在创建新表单实例时正确创建它,如果它随着表单而死,我很好。我不明白为什么如果正确创建了新的计时器对象,计时器将不起作用。
  • 认为您忘记在新实例中启动计时器之前启用它。在启动计时器之前尝试将其包含在 form_load 中。 'timer.Enabled = true'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多