2015-06-24 50 views
0

我有一个叫做Movement的类,当Lead方法被执行时,它将我的表单上的一个图片框(左边的人)移动到一个随机位置。我还有一种方法可以移动另一个图片框(右侧的黑色家伙),名为SetMrShadowToMove。这两个图片框被假设为同时移动并同时到达随机点(两个图片框为一个点)。简单的多线程问题

enter image description here

就目前而言,这些方法使用计时器来移动图片框,但我的主要意图是有其运行的循环,直到图片框的坐标满足随机点回升,同时使用了Thread.Sleep来推迟过程并制作动画。

为此,我需要在不同的线程上运行这两种方法,所以我的UI线程不会被冻结,并且这些方法会同时运行。

我的问题是,我不知道如何在不同的线程上运行这些方法,也不知道如何访问其他线程上的图片框(似乎这与调用和东东!)。

解决此问题的最佳方法是什么?

+1

最好的方法是不使用winforms来创建游戏 – dotctor

+0

这不是一个游戏,只是一个练习动画来学习多线程和其他的东西。 –

+0

http://www.codeproject.com/Articles/18702/Threading-in-NET-and-WinForms – dotctor

回答

1

最好的方法(在我看来)是通过使用后台工作。

那些事情可以在后台做计算。如果您想在此之后更新接口,则可以使用报告进度事件来调用主(接口)线程并重画屏幕。即使您希望将后台工作人员的事件视为最终工作,您也可以完成工作(例如,如果先生影子被“销毁”或其他)。

我不知道你的影子先生的代码,所以我没有任何直接的示例代码给你。但是可以在msdn here上找到有关如何使用后台工作者的完整示例。我希望这能帮到您。

+0

其实这里的主要目标是创建一个步行动画。这就是为什么我需要更新我的循环执行过程中的主线程。考虑一个while循环,直到X和Y等于RndX和RndY。随着循环的每次运行,图片框的X或Left值以及Y或Top值将根据RndX和RndY进行递增或递减。这里最重要的是在每次图片框移动后更新用户界面。 –

+0

什么决定图片框是否移动?它是应该在后台运行的图片框本身的实体吗?如果是这样,您可以在dowork事件中创建循环。在该循环中,您可以计算图片框的位置以及应该为动画显示的图像。您发送到报告进度事件的这些信息,并且您有一个更新您的GUI。如果你在迭代中让睡眠时间不长,它可能会很平滑(请记住,虽然你永远不会在窗体中获得完全平滑的动画,但你需要不同的东西,然后是一个图片框和窗体窗体。 –

+0

10图片框应该是开始在Form_Load上同时移动,并且它们会一直移动,直到用户终止应用程序为止。如果我使用BackgroundWorker类的DoWork事件,并且在DoWork中的一个循环中使用Thread.Sleep(我讨论过的循环在之前的评论中),我将如何访问/调用我的图片框来改变他们的图片?除了背景工作者解决方案之外,我将如何使用同时运行的简单线程实现相同的功能?如果您有兴趣,我可以告诉你我的整个代码(这不是很多btw)澄清。 –