使用c#multithreading模拟种族

时间:2013-11-11 09:27:16

标签: c# multithreading

我的任务是模拟人们跑步。

一个人每300秒做两步, 第二个是在y秒内做x步。

我不想要一个完整的解决方案,只是知道这个机制是正确的,为什么。

p.s - 起初我想过使用计时器,但是对于第二场比赛,它还不够好。

6 个答案:

答案 0 :(得分:2)

您需要的是计算每个跑步者在特定时间行进的距离的公式:

runner[n].StepsTraveled = secondsPassed * (runner[n].StepsPerSecond);

无论刷新间隔如何,您都会始终保持正确的距离。您可以使用任何分辨率计时器,甚至刷新每个按钮。

你也不需要多线程。

如果必须使用多线程,那么每个线程都可以具有以下结构:

var runner = this runner for the thread;
while(running) 
{
  Thread.Sleep(runner.Seconds * 1000); // convert to milliseconds
  runner.StepsTraveled += runner.Steps;  
}

您可以为每个跑步者使用相同的线程代码,只需要更改它们将使用的runner对象。

答案 1 :(得分:0)

最简单的解决方案是将委托传递给计时器(C#有多个多线程计时器\工作者实现)。 我已经在Windows Forms上制作了类似的东西 - arkanoid游戏,请查看: https://github.com/ElliotCoder/GDIPlus_Arkanoid

答案 2 :(得分:0)

您不需要多线程,只需使用2个计时器300 / 2y / x秒。或者,如果你真的想要,创建2个线程,在第一个等待为300,然后执行2个步骤(或均匀,150秒和1步),在第二个等待 x / y并执行一步。

答案 3 :(得分:0)

您可以使用后台工作人员,其中"进度已更改"事件很容易更新GUI以显示"跑步者"

答案 4 :(得分:0)

我会创建自己的Race(或World)类来获取要移动的所有对象(可能是因为它们实现了IMoveable)。然后这个类还有一个方法IncrementTime()(也许IncrementTime(TimeSpan timeToElaps))。每当调用此方法时,它都会从每个IMoveable Speed获取,并相应地将其Position更改为传递的时间和对象的速度。

通过使用此方法,您可以独立于实际时间,并且如果需要,您还可以更快或更慢地运行模拟。不过,您需要在您的应用程序中使用某种Timer来触发您的IncrementTime()常规,但很容易影响它需要运行的实时。

答案 5 :(得分:0)

以下是您需要的构建模块:

  • 代表一个跑步者的种族方法;为避免使用两种不同的方法,您可以将公共代码分解并传递速度参数

  • 表示您需要在新System.Threading.Thread

  • 的上下文中执行每个方法的两个参赛者比赛的并发执行
  • 表示您将使用Thread.Sleep方法的时间的推移

  • 表示主线程的等待(假设它代表裁判)你将使用Thread.Join方法

希望我什么都没有错过......