我做了一个棋类游戏,想要分别对玩家和电脑计时,可是这里出现了错误,希望高手指教. private System.Timers.Timer timerComputer = new System.Timers.Timer();
timerComputer.Elapsed += new ElapsedEventHandler(OnTimer);
timerComputer.Interval = 1; timer1.Enabled = false;
MouseDown()
{
timerPerson.EnableD=false;
timerComputer.Enabled = true;
gm.ComputerPutChess();
timerComputer.Enabled = false;
timer1.Enabled = true;
} public void OnTimer(Object source, ElapsedEventArgs e)
{
time2 = time2 + 1;
labelTime.Text = time2.ToString();
} 我想让他在窗体的label控件上显示时,出错:
线程间操作无效: 从不是创建控件“labelTime”的线程访问它。
请问大家如何解决!
timerComputer.Elapsed += new ElapsedEventHandler(OnTimer);
timerComputer.Interval = 1; timer1.Enabled = false;
MouseDown()
{
timerPerson.EnableD=false;
timerComputer.Enabled = true;
gm.ComputerPutChess();
timerComputer.Enabled = false;
timer1.Enabled = true;
} public void OnTimer(Object source, ElapsedEventArgs e)
{
time2 = time2 + 1;
labelTime.Text = time2.ToString();
} 我想让他在窗体的label控件上显示时,出错:
线程间操作无效: 从不是创建控件“labelTime”的线程访问它。
请问大家如何解决!
public void OnTimer(Object source, ElapsedEventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
time2 = time2 + 1;
labelTime.Text = time2.ToString();
}
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
time2 = time2 + 1;
labelTime.Text = time2.ToString();
}
这样改他不会动态的显示,就只是在棋下完后显示一个数字
{
Invoke(new EventHandle(TimerAction), source, e);
}public void TimerAction(Object source, EventArgs e)
{
time2 = time2 + 1;
labelTime.Text = time2.ToString();
}
如果你确实不想使用Forms.Timer,那么你应该改一下你的代码,参照下面:
private void button1_Click(object sender, EventArgs e)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
}private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (this.InvokeRequired)
{
try
{
ElapsedEventHandler OnTick = new ElapsedEventHandler(this.timer_Elapsed);
this.Invoke(OnTick, new object[] { sender, e });
}
catch
{ }
return;
}
this.label1.Text = DateTime.Now.ToString();
}
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;这个方式不建议,有的时候跨线程的时候有异常