当前位置: 代码迷 >> C# >> winfrom 通过线程add一个控件如何能让他动起来
  详细解决方案

winfrom 通过线程add一个控件如何能让他动起来

热度:568   发布时间:2016-05-05 02:56:32.0
winfrom 通过线程add一个控件怎么能让他动起来

 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  纯属是自找麻烦。
  相关解决方案