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






4.03/5 (8投票s)
2005年12月9日
2分钟阅读

41967

1225
这是一个小型多线程应用程序,模拟汽车在随机方向上移动。
引言
这是一个小型多线程应用程序,模拟汽车在随机方向上移动。每辆车独立于其他车辆移动,并与一个单独的线程关联。为此编写了一个从 CWinthread
派生的类 CCarThread
。(CWinThread
的 m_bAutoDelete
参数设置为 false
,以便即使在线程终止后对象仍然存在。)
汽车使用位图资源和父窗口的设备上下文绘制。由于一次只有一个线程可以拥有设备上下文,因此使用 critical_section cs
来同步所有权。
汽车可以向以下八个方向之一移动。假定这八个方向。
资源中存储了每个方向的单独位图。
汽车的随机运动由 RandomVelocityChange()
函数获得,该函数会随机改变速度。为了使此模拟看起来更逼真,允许的速度变化如下
其中实线表示当前运动方向,虚线表示允许改变的方向,而实线蓝色表示当前方向不允许改变的方向。
碰撞检测
为了检测汽车碰撞的可能性,每个汽车线程都会将其自身与所有其他汽车进行检查。所有汽车的线程指针存储在一个向量中,该向量是 CCarThread
的静态成员。任何线程都可以使用 critical_secion csCrash
(它也是 CCarThread
的静态成员)访问该向量。
碰撞检查如下:如果汽车占据的矩形区域与另一辆汽车的矩形区域重叠,则两辆汽车发生碰撞。(这是一种分布式控制。)然后它向另一辆汽车发出终止信号。请注意,为了避免死锁,发生碰撞的汽车将被移动到一个单独的数组中,然后被销毁。
为了杀死一个线程,将该线程的事件 m_hEventKill
设置为已设置状态,然后等待线程自行终止。然后它向主窗口发送消息以删除或杀死自身。您可以在模拟期间随时删除所有汽车。