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)。谁教你编程的?
随便写死循环、然后Sleep(1000)。谁教你编程的?
#3
不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。
#4
我只是想精简问题,然后了解怎么用,亲,您不觉得您说的都是题外话吗?
#5
Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。
#6
我常试了这样的方式~可是在运行时~我不能做其它操作了
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
因为控件数量和线程数都想用参数来控制,所以如果这种方法可行的话,写起来会很方便。
#11
是的,先看看能否这样实现。
#12
new不同的timer也一样可以的啊,没必要自己写线程来控制,timer本质也是线程,只不过是定时通知主线程执行相关代码
#13
如果你从来没有系统的学过编程,而只是作为一个初学者,想"随便玩玩",那么我劝你还是从定时器玩起,不要玩线程
#14
线程只应该做跟UI无关的事情
线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了
多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情
你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通
线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了
多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情
你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通
#15
LZ是不是要做抖动窗口之类的东西?
#16
谢谢。我想让不同的人做不同的事~同时我也能做别的事。我不知道你说的之后再问他要个勺子是哪块东东,我想通过个事件为窗体加上个图片让自己“飞”。。。不用Timer控件的话就只能用线程,不然它就只能自己“飞”了。你是不是想告诉我线程无法实现这样的处理?
#17
通过个事件为窗体加上个图片让自己“飞”
-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能 用winform 纯属是自找麻烦。
-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能 用winform 纯属是自找麻烦。
#18
已解决,CDSN里半吊子真是越来越多,我要用线程解决问题,如果你会请告诉我们这样的初学者,如果你不会你又何必BB些别的话题?线程里的方法可以加参数,把new出的控件放参数都就能解决问题。一个比一个爱BB。
谢谢愿意给出方法和逻辑的朋友。把分散你们。
谢谢愿意给出方法和逻辑的朋友。把分散你们。
#19
为何你不直接用time控件
#20
都看不懂
#21
#1
最好不要用线程,而是用Winform的定时器来做。
#2
如果你使用 Thread.Start 的目的就是为了能够弄个死循环在哪里,那么要是让我们的一位程序员“小女子”看你这个程序一定会说“真是醉了”,让我看则会说“回家上班吧”。
随便写死循环、然后Sleep(1000)。谁教你编程的?
随便写死循环、然后Sleep(1000)。谁教你编程的?
#3
不管这种程序能不能让控件显示 Location 位置,不管它能不能每隔1秒钟就表演一次,关键是这种类型的代码代表着一类初学者滥用轮询时的思路。在一个实际的项目中会很快危害到整个系统的性能。
#4
我只是想精简问题,然后了解怎么用,亲,您不觉得您说的都是题外话吗?
#5
Invoke 跨线程,看野比喵的多线程,其中还提供了类库,可以直接用。
#6
我常试了这样的方式~可是在运行时~我不能做其它操作了
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
因为控件数量和线程数都想用参数来控制,所以如果这种方法可行的话,写起来会很方便。
#11
是的,先看看能否这样实现。
#12
new不同的timer也一样可以的啊,没必要自己写线程来控制,timer本质也是线程,只不过是定时通知主线程执行相关代码
#13
如果你从来没有系统的学过编程,而只是作为一个初学者,想"随便玩玩",那么我劝你还是从定时器玩起,不要玩线程
#14
线程只应该做跟UI无关的事情
线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了
多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情
你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通
线程的作用,就好比你去肯德基点餐,然后给你点餐的人就是UI线程.如果他自己去后面给你配菜,那么你再问他要个勺子,要个番茄酱什么的,他就没工夫理你了
多线程就好比多个人,前面点餐的依然接受你的问题,而后面有别人去干与你的交流无关的事情
你不能把点餐的人架空,让他闲着,而变着方法的想让厨师和客户沟通
#15
LZ是不是要做抖动窗口之类的东西?
#16
谢谢。我想让不同的人做不同的事~同时我也能做别的事。我不知道你说的之后再问他要个勺子是哪块东东,我想通过个事件为窗体加上个图片让自己“飞”。。。不用Timer控件的话就只能用线程,不然它就只能自己“飞”了。你是不是想告诉我线程无法实现这样的处理?
#17
通过个事件为窗体加上个图片让自己“飞”
-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能 用winform 纯属是自找麻烦。
-》用WPF 中的动画呀。可以一边动,一边旋转等等。你说的功能 用winform 纯属是自找麻烦。
#18
已解决,CDSN里半吊子真是越来越多,我要用线程解决问题,如果你会请告诉我们这样的初学者,如果你不会你又何必BB些别的话题?线程里的方法可以加参数,把new出的控件放参数都就能解决问题。一个比一个爱BB。
谢谢愿意给出方法和逻辑的朋友。把分散你们。
谢谢愿意给出方法和逻辑的朋友。把分散你们。
#19
为何你不直接用time控件
#20
都看不懂