⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadcollection.h

📁 模拟哲学家就餐过程
💻 H
字号:
#ifndef _COLLECT_PERSON_THREAD_H_
#define _COLLECT_PERSON_THREAD_H_

#include <afxmt.h>
#include <afxtempl.h>
#include <time.h>

#define   WM_USER_NOTIFY  WM_USER+300
#define   PI            3.14159
#define   PI2           2*PI

#define   KNIFE_BIT     1
#define   FORK_BIT      2

#define   KNIFE_MASK    2
#define   FORK_MASK     1

#define   BLOCK         0
#define   CATCHING      1
#define   BEGINEATING   2
#define   FINISHDOWN    3
#define   TIME_BASE     1

int  GetRandomInt( bool bInit, int limit );

class PERSON_INFO : public CObject
{
public:
	friend class PersonThread;
	PersonThread * pthread;			//该人所对应的线程对象
	DWORD   defaultpriority;		//缺省随机优先级,非缺省时所有线程设置同样优先级
	int   	index;					//人的位置序号:仅考虑拿到餐具,没考虑从哪边拿到....
	int	    tools, fork,knife;		//取得的标志与位置序号
	int		status, step, steptime;
	struct  compete{ int loc,what; }compete;
	CString message;
};
typedef CTypedPtrArray<CObArray, PERSON_INFO*> CPersonInfoArray;	//路口集合


class CThreadCollection //管理所有的线程集合
{
public:
	bool             bUnBlockSelf;
	bool			 bUpdateNotify;     //允许显示输出
	bool			 bThreadsPause;		//标志 所有线程 suspend 或 resume 状态
	bool             fSyncChecked;		//CMutex的同步互斥开关
	bool             fBlockChecked;		//不阻碍邻居开关
	CMutex			 m_mutex;			//同步互斥
	CPersonInfoArray personArr;			//人与线程的动态矩阵数组
	CUIntArray       dinnerToolArr;		//餐具的动态矩阵数组
	CUIntArray		 threadsResumeArr;	//激活线程集的随机顺序组
	CPoint point;    int rr,delta, dd;	//坐标定义
    CWnd*            m_pWnd;			//显示窗体
	CListBox*        m_pListBox;		//文本显示列表
	int				 m_step, nContinousPrompt;
    CMapWordToPtr    competeMap;
    long   counter;

	CThreadCollection();
	virtual ~CThreadCollection();

	int   GetItemsUpper();
	void  SetSyncCheckEnable( bool check ){	fSyncChecked = check; }
	void  SetBlockCheckEnable(bool check){ fBlockChecked=check;}
	void  SetUnBlockSelfCheck(bool check){ bUnBlockSelf =check;}
	void  SetupThreadStepTime( int delay );
	void  SetDisplayCoordinate(CPoint *pt, int ra, int delta);
	void  CreateRandomMap(CUIntArray &Arr, int nums);
	void  initThreadCollectionClass(CWnd* pWnd, CListBox*pBox, int nums, int delay);
	PersonThread* CreateBeginThread(PERSON_INFO * person, DWORD nPriority);
	void  initCollectionThreads(int nCurSel);
	void  DestroyThreadCollection();
	void  FastKillPersonThreads();
	void  SlowKillPersonThreads();
	int   FinishPersonThreads();

	void  ToggleCollectionThreadsPause(bool bPaused);
	void  SetCurrentPriorityClass(int nCurSel);
	int   CheckPersonCatchStatus(int status);
	int   CheckPersonFinishStatus();
	DWORD SetPersonThreadsPriority(int nCurSel);

	void  StatCompetePersons();
	void  PromptContinousCheckBox(int show);
	int   WillBlockNeighbor(int iCurrent, int kf, int upper);
	int   CatchDinnerToolkit(PERSON_INFO * person, bool fromLeft, bool isFork);
	void  PutdownDinnerToolkit(PERSON_INFO * person, int set, int mask);
	void  UpdateNotify( PERSON_INFO * person );
	void  DrawCollectionResult(CDC *pDC);
};

// PersonThread thread

class PersonThread : public CWinThread
{
	DECLARE_DYNCREATE(PersonThread)
public:	//通用定义,根据所加变量重新虚构函数
	HANDLE m_hEventKill, m_hEventDead;		//被杀死亡消息, 如采用自动结束方式无需这些变量
	static HANDLE m_hAnotherDead;			//线程退出执行体end -- delete 中自动死亡消息
	static CRITICAL_SECTION m_criLock;		//同步互斥

	virtual BOOL InitInstance();	 //执行体的一种
	virtual int  Run();				//执行体的一种
	        void KillThread();		//kill主要使它脱离执行体
	virtual void Delete();			//在退出线程执行体后调用,可以设置dead事件
	virtual ~PersonThread();		//自动析构
	PersonThread(){;}				//自动建构

public:	//专用定义,属于本对象功能定义
	friend class PERSON_INFO;
	PERSON_INFO*		person;		 //就餐者信息
	CThreadCollection * m_pThreads;  //线程集合
	BOOL         m_bDone;			 //线程完成退出

	void  ThreadSingleStepRun();
	void  initPersonThread(CThreadCollection *threads, PERSON_INFO*pPerson);
 	int   GetPersonStatus(){ return person->status;}
	int   CheckOneToolkit(int index, int kf, int upper);
	int   CheckPersonStatus( int &status );
    int   CatchDinnerToolkit();
	void  DelayStepTime(BOOL bDone);
	void  PutdownDinnerToolkit( );

	DECLARE_MESSAGE_MAP()
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -