【问题标题】:Simple multi-threading issue简单的多线程问题
【发布时间】:2015-06-24 11:40:32
【问题描述】:

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

目前,这些方法使用计时器来移动图片框,但我的主要目的是有一个循环运行,直到图片框的坐标遇到随机点,同时使用 Thread.Sleep 延迟该过程并进行它的动画。

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

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

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

【问题讨论】:

标签: c# multithreading invoke


【解决方案1】:

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

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

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

【讨论】:

  • 其实这里的主要目标是创建一个行走动画。这就是为什么我需要在每次执行循环时更新主线程。考虑一个运行直到 X 和 Y 等于 RndX 和 RndY 的 while 循环。每次循环运行时,图片框的 X 或 Left 值和 Y 或 Top 值会根据 RndX 和 RndY 递增或递减。这里重要的是每次图片框移动后更新 UI。
  • 是什么决定了图片框是否移动?是图片框本身的实体应该在后台运行吗?如果是这样,您可以在 dowork 事件中创建循环。在那个循环中,您计算​​图片框应该去哪里以及应该为动画显示什么图像。您将此信息发送到报告进度事件,然后您就可以更新您的 GUI。如果您在迭代中使睡眠时间不长,它可能会有点平滑(请记住,尽管您从未在表单中获得完全平滑的动画,但您需要不同的东西,然后是图片框和窗口表单。
  • 图片框应该在 Form_Load 上同时开始移动。他们将继续移动,直到应用程序被用户终止。如果我使用 BackgroundWorker 类的 DoWork 事件,并在 DoWork 内的循环中使用 Thread.Sleep(我在上一条评论中讨论过的循环),我将如何访问/调用我的图片框来更改它们的图片?除了 backgroundworker 解决方案之外,我如何使用同时运行的简单线程来实现相同的目标?如果您有兴趣,我可以向您展示我的整个代码(顺便说一句,它并不多)以进行澄清。
  • 在这种情况下,您希望获得一个所谓的模拟循环。基本上你所做的就是创建一个后台工作者。它'无限地'循环。在我里面你调用报告进度事件。在那种情况下,你让它提取某些图像框应该在哪里的所有数据,然后你让它绘制它(移动图片框,更改图像等等)。完整的解释可以在这里找到:gamasutra.com/view/feature/130247/…(注意这篇文章不是我写的,我只是用谷歌找到的)
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多