我用多线程做了一个打字游戏源代码如下
private void timer1_Tick(object sender, EventArgs e)
{
Label l = new Label();
l.AutoSize = true;
r = new Random();
l.Left = r.Next(0, this.Width);
l.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
l.Name = "label1";
l.Top = 20;
int i1 = 0;
for (int i = 0; i < 100000; i++)
{
i1 = 65 + r.Next(57);
if (i1 >= 91 && i1 <= 96)
{ }
else
{
break;
}
}
l.Text = l.Text = Convert.ToChar(i1).ToString(); this.Controls.Add(l);
MoveLabel m=new MoveLabel(l);
Thread thread = new Thread(new ThreadStart(m.Move));
thread.Start();
}
public class MoveLabel
{
//私有成员,Label标签
Label _label; //随机数对象,用来控制label的位置,即在X轴上的位置
Random _rand = new Random(); /// <summary>
/// 读写属性,对标签的设置与获取
/// </summary>
public Label Label
{
get
{
return this._label;
}
set
{
this._label = value;
}
} /// <summary>
/// 参数化构造方法
/// </summary>
/// <param name="label">标签</param>
public MoveLabel(Label label)
{
this._label = label;
} #region 可删除的测试代码 ///// <summary>
///// 参数化构造方法重载1
///// </summary>
///// <param name="panel">整个Panel作为参数来传递</param>
//public MoveLabel(Panel panel)
//{
// this._panel = panel;
//}
#endregion #region 测试代码 /// <summary>
/// 移动标签的方法
/// </summary>
public void Move()
{
//声明一个随机对象,用来作为lable的位置随机
// _rand = new Random(); if (this._label != null)
{
while (true)
{
//让label向下落
this._label.Top += 3;
//测试,让_lable的横坐标随意变化
this._label.Left = _rand.Next(0, 590); //让线程休眠100毫秒
Thread.Sleep(100); if (this._label.Top == 450)
{
this._label = null;
//关闭当前线程,因为lable已经被删除,这里是为了释放资源
Thread.CurrentThread.Abort();
}
}
}
else
{
//关闭当前线程,因为lable已经被删除,这里是为了释放资源
Thread.CurrentThread.Abort();
}
} #endregion }
线程间操作无效: 从不是创建控件“多线程打字游戏”的线程访问它。
public void Move()
{
//声明一个随机对象,用来作为lable的位置随机
// _rand = new Random(); if (this._label != null)
{
while (true)
{
//让label向下落
this._label.Top += 3;
错误地点
Thread.Sleep(100);还有我感觉这个是休眠主线程的我想要休眠当前线程的应该怎么写,高手指点啊
private void timer1_Tick(object sender, EventArgs e)
{
Label l = new Label();
l.AutoSize = true;
r = new Random();
l.Left = r.Next(0, this.Width);
l.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
l.Name = "label1";
l.Top = 20;
int i1 = 0;
for (int i = 0; i < 100000; i++)
{
i1 = 65 + r.Next(57);
if (i1 >= 91 && i1 <= 96)
{ }
else
{
break;
}
}
l.Text = l.Text = Convert.ToChar(i1).ToString(); this.Controls.Add(l);
MoveLabel m=new MoveLabel(l);
Thread thread = new Thread(new ThreadStart(m.Move));
thread.Start();
}
public class MoveLabel
{
//私有成员,Label标签
Label _label; //随机数对象,用来控制label的位置,即在X轴上的位置
Random _rand = new Random(); /// <summary>
/// 读写属性,对标签的设置与获取
/// </summary>
public Label Label
{
get
{
return this._label;
}
set
{
this._label = value;
}
} /// <summary>
/// 参数化构造方法
/// </summary>
/// <param name="label">标签</param>
public MoveLabel(Label label)
{
this._label = label;
} #region 可删除的测试代码 ///// <summary>
///// 参数化构造方法重载1
///// </summary>
///// <param name="panel">整个Panel作为参数来传递</param>
//public MoveLabel(Panel panel)
//{
// this._panel = panel;
//}
#endregion #region 测试代码 /// <summary>
/// 移动标签的方法
/// </summary>
public void Move()
{
//声明一个随机对象,用来作为lable的位置随机
// _rand = new Random(); if (this._label != null)
{
while (true)
{
//让label向下落
this._label.Top += 3;
//测试,让_lable的横坐标随意变化
this._label.Left = _rand.Next(0, 590); //让线程休眠100毫秒
Thread.Sleep(100); if (this._label.Top == 450)
{
this._label = null;
//关闭当前线程,因为lable已经被删除,这里是为了释放资源
Thread.CurrentThread.Abort();
}
}
}
else
{
//关闭当前线程,因为lable已经被删除,这里是为了释放资源
Thread.CurrentThread.Abort();
}
} #endregion }
线程间操作无效: 从不是创建控件“多线程打字游戏”的线程访问它。
public void Move()
{
//声明一个随机对象,用来作为lable的位置随机
// _rand = new Random(); if (this._label != null)
{
while (true)
{
//让label向下落
this._label.Top += 3;
错误地点
Thread.Sleep(100);还有我感觉这个是休眠主线程的我想要休眠当前线程的应该怎么写,高手指点啊
public void Move()
{
//声明一个随机对象,用来作为lable的位置随机
// _rand = new Random(); if (this._label != null)
{
while (true)
{
//让label向下落
this._label.Top += 3;
错误地点
主要看这里吧
你说的应该是这样吧?
Label l = new Label();
l.BeginInvoke(m.Move,null);
是这么写么?
m.mov.BeginInvoke(l,this,null,null);
明显没有自己去尝试解决过
解决方法1,用委托
解决方法2,用vs2003
解决方法3,Control.CheckXXXXXXXXXXXXXXX=false;