65.9K
CodeProject 正在变化。 阅读更多。
Home

具有分布式控件的多线程演示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.03/5 (8投票s)

2005年12月9日

2分钟阅读

viewsIcon

41967

downloadIcon

1225

这是一个小型多线程应用程序,模拟汽车在随机方向上移动。

引言

这是一个小型多线程应用程序,模拟汽车在随机方向上移动。每辆车独立于其他车辆移动,并与一个单独的线程关联。为此编写了一个从 CWinthread 派生的类 CCarThread。(CWinThreadm_bAutoDelete 参数设置为 false,以便即使在线程终止后对象仍然存在。)

汽车使用位图资源和父窗口的设备上下文绘制。由于一次只有一个线程可以拥有设备上下文,因此使用 critical_section cs 来同步所有权。

汽车可以向以下八个方向之一移动。假定这八个方向。

资源中存储了每个方向的单独位图。

汽车的随机运动由 RandomVelocityChange() 函数获得,该函数会随机改变速度。为了使此模拟看起来更逼真,允许的速度变化如下

其中实线表示当前运动方向,虚线表示允许改变的方向,而实线蓝色表示当前方向不允许改变的方向。

碰撞检测

为了检测汽车碰撞的可能性,每个汽车线程都会将其自身与所有其他汽车进行检查。所有汽车的线程指针存储在一个向量中,该向量是 CCarThread 的静态成员。任何线程都可以使用 critical_secion csCrash(它也是 CCarThread 的静态成员)访问该向量。

碰撞检查如下:如果汽车占据的矩形区域与另一辆汽车的矩形区域重叠,则两辆汽车发生碰撞。(这是一种分布式控制。)然后它向另一辆汽车发出终止信号。请注意,为了避免死锁,发生碰撞的汽车将被移动到一个单独的数组中,然后被销毁。

为了杀死一个线程,将该线程的事件 m_hEventKill 设置为已设置状态,然后等待线程自行终止。然后它向主窗口发送消息以删除或杀死自身。您可以在模拟期间随时删除所有汽车。

参考文献

MSDN 文章

© . All rights reserved.