private void but_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Method));
thread.Start();
}
private void Method()
{
PictureBox pb = new PictureBox();
this.Controls.Add(pb);
pb.Image = imageList.Images[0];
while (true)
{
pb.Location = new Point(pb.Location.X+1,pb.Location.Y+1);
Thread.Sleep(1000);
}
}
这段代码存在很多问题,还请高手给调调。
------解决思路----------------------
最好不要用线程,而是用Winform的定时器来做。
------解决思路----------------------
Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。
------解决思路----------------------
PictureBox _pb;
private void but_Click(object sender, EventArgs e)
{
_pb = new PictureBox();
this.Controls.Add(pb);
_pb.Image = imageList.Images[0];
Thread thread = new Thread(new ThreadStart(Method));
thread.Start();
}
private void safeChangePBLoc()
{
if (_pb.InvokeRequired)
{
_pb.Invoke (new Action (safeChangePBLoc));
return;
}
_pb.Location = new Point(_pb.Location.X+1,_pb.Location.Y+1);
}
private void Method()
{
while (true)
{
this.safeChangePBLoc ();
Thread.Sleep(1000);
}
}
创建控件,改变控件显示相关的属性都不能在子线程做;
另外,用线程干这个。。。很无稽
------解决思路----------------------
这个需要用线程做吗, 用个定时器 间隔1000ms, 然后控制Image位置就行了.
------解决思路----------------------
属于子线程UI画面的问题。
------解决思路----------------------
new不同的timer也一样可以的啊,没必要自己写线程来控制,timer本质也是线程,只不过是定时通知主线程执行相关代码
------解决思路----------------------
如果你从来没有系统的学过编程,而只是作为一个初学者,想"随便玩玩",那么我劝你还是从定时器玩起,不要玩线程
------解决思路----------------------
线程只应该做跟UI无关的事情
线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了
多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情
你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通
------解决思路----------------------
LZ是不是要做抖动窗口之类的东西?
------解决思路----------------------
通过个事件为窗体加上个图片让自己“飞”
-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能 用winform 纯属是自找麻烦。