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

时间:2021-08-01 01:00:51

 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);
            }
        }


这段代码存在很多问题,还请高手给调调。

20 个解决方案

#1


最好不要用线程,而是用Winform的定时器来做。

#2


如果你使用 Thread.Start 的目的就是为了能够弄个死循环在哪里,那么要是让我们的一位程序员“小女子”看你这个程序一定会说“真是醉了”,让我看则会说“回家上班吧”。

随便写死循环、然后Sleep(1000)。谁教你编程的?

#3


不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。

#4


引用 3 楼 sp1234 的回复:
不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。


我只是想精简问题,然后了解怎么用,亲,您不觉得您说的都是题外话吗?

#5


Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。

#6


引用 5 楼 BenBenBears 的回复:
Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。


我常试了这样的方式~可是在运行时~我不能做其它操作了


            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { GameDBMethod(); }));
                return;
            }

#7




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);
}
}

创建控件,改变控件显示相关的属性都不能在子线程做;
另外,用线程干这个。。。很无稽

#8


这个需要用线程做吗,    用个定时器 间隔1000ms,  然后控制Image位置就行了.

#9


属于子线程UI画面的问题。

#10


引用 8 楼 running_crazy 的回复:
这个需要用线程做吗,    用个定时器 间隔1000ms,  然后控制Image位置就行了.


因为控件数量和线程数都想用参数来控制,所以如果这种方法可行的话,写起来会很方便。

#11


引用 9 楼 tiana0 的回复:
属于子线程UI画面的问题。

是的,先看看能否这样实现。

#12


new不同的timer也一样可以的啊,没必要自己写线程来控制,timer本质也是线程,只不过是定时通知主线程执行相关代码

#13


如果你从来没有系统的学过编程,而只是作为一个初学者,想"随便玩玩",那么我劝你还是从定时器玩起,不要玩线程

#14


线程只应该做跟UI无关的事情

线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了

多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情

你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通

#15


LZ是不是要做抖动窗口之类的东西?

#16


引用 14 楼 Z65443344 的回复:
线程只应该做跟UI无关的事情

线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了

多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情

你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通


谢谢。我想让不同的人做不同的事~同时我也能做别的事。我不知道你说的之后再问他要个勺子是哪块东东,我想通过个事件为窗体加上个图片让自己“飞”。。。不用Timer控件的话就只能用线程,不然它就只能自己“飞”了。你是不是想告诉我线程无法实现这样的处理?

#17


通过个事件为窗体加上个图片让自己“飞”

-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能  用winform  纯属是自找麻烦。

#18


已解决,CDSN里半吊子真是越来越多,我要用线程解决问题,如果你会请告诉我们这样的初学者,如果你不会你又何必BB些别的话题?线程里的方法可以加参数,把new出的控件放参数都就能解决问题。一个比一个爱BB。
谢谢愿意给出方法和逻辑的朋友。把分散你们。

#19


为何你不直接用time控件

#20


都看不懂 winfrom 通过线程add一个控件怎么能让他动起来winfrom 通过线程add一个控件怎么能让他动起来winfrom 通过线程add一个控件怎么能让他动起来

#1


最好不要用线程,而是用Winform的定时器来做。

#2


如果你使用 Thread.Start 的目的就是为了能够弄个死循环在哪里,那么要是让我们的一位程序员“小女子”看你这个程序一定会说“真是醉了”,让我看则会说“回家上班吧”。

随便写死循环、然后Sleep(1000)。谁教你编程的?

#3


不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。

#4


引用 3 楼 sp1234 的回复:
不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。


我只是想精简问题,然后了解怎么用,亲,您不觉得您说的都是题外话吗?

#5


Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。

#6


引用 5 楼 BenBenBears 的回复:
Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。


我常试了这样的方式~可是在运行时~我不能做其它操作了


            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { GameDBMethod(); }));
                return;
            }

#7




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);
}
}

创建控件,改变控件显示相关的属性都不能在子线程做;
另外,用线程干这个。。。很无稽

#8


这个需要用线程做吗,    用个定时器 间隔1000ms,  然后控制Image位置就行了.

#9


属于子线程UI画面的问题。

#10


引用 8 楼 running_crazy 的回复:
这个需要用线程做吗,    用个定时器 间隔1000ms,  然后控制Image位置就行了.


因为控件数量和线程数都想用参数来控制,所以如果这种方法可行的话,写起来会很方便。

#11


引用 9 楼 tiana0 的回复:
属于子线程UI画面的问题。

是的,先看看能否这样实现。

#12


new不同的timer也一样可以的啊,没必要自己写线程来控制,timer本质也是线程,只不过是定时通知主线程执行相关代码

#13


如果你从来没有系统的学过编程,而只是作为一个初学者,想"随便玩玩",那么我劝你还是从定时器玩起,不要玩线程

#14


线程只应该做跟UI无关的事情

线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了

多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情

你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通

#15


LZ是不是要做抖动窗口之类的东西?

#16


引用 14 楼 Z65443344 的回复:
线程只应该做跟UI无关的事情

线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了

多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情

你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通


谢谢。我想让不同的人做不同的事~同时我也能做别的事。我不知道你说的之后再问他要个勺子是哪块东东,我想通过个事件为窗体加上个图片让自己“飞”。。。不用Timer控件的话就只能用线程,不然它就只能自己“飞”了。你是不是想告诉我线程无法实现这样的处理?

#17


通过个事件为窗体加上个图片让自己“飞”

-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能  用winform  纯属是自找麻烦。

#18


已解决,CDSN里半吊子真是越来越多,我要用线程解决问题,如果你会请告诉我们这样的初学者,如果你不会你又何必BB些别的话题?线程里的方法可以加参数,把new出的控件放参数都就能解决问题。一个比一个爱BB。
谢谢愿意给出方法和逻辑的朋友。把分散你们。

#19


为何你不直接用time控件

#20


都看不懂 winfrom 通过线程add一个控件怎么能让他动起来winfrom 通过线程add一个控件怎么能让他动起来winfrom 通过线程add一个控件怎么能让他动起来

#21