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

📄 macmange2.cpp

📁 一个简单的机器调度模拟程序。根据任务的时长
💻 CPP
字号:
// MacMange2.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include "MacManage.h"
#include "commctrl.h"
#include "ListView.h"

//设置时间消息
#define WM_MYTIMER WM_USER + 103
//时间片时间间隔,以微秒来计算
#define ELAPSE 1000


//工作车间
wplace wp ( 5 ) ;		//默认有5台机器
//上显示台
ListShow up ;
ListShow down ;
//下显示台

HINSTANCE hInst ;
//消息循环
LRESULT CALLBACK WndProc ( HWND , UINT , WPARAM , LPARAM ) ;
//初始化对话框
void InitDialog ( HWND ) ;
//初始化显示台
bool InitShow ( HWND ) ;
//刷新显示台数据
void Refresh ( HWND ) ;
//添加任务到车间
bool AddTask ( HWND ) ;
//判断是否输入回车
bool InputReturn ( HWND subWnd , int ID , char * buffer , int n ) ;
//删除任务 
bool DelTask ( HWND , int ) ;
//改变车间机器数目
bool ChangeMac ( HWND ) ;
//车间工作开关处理
void deal_work ( HWND ) ;
//定义定时器中断回调函数的原型
VOID CALLBACK MyTimerProc ( HWND hWnd , UINT uMsg , UINT idEvent , DWORD dwTime ) ;

/*-------------------------------------------------------------------------------------*/
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	/*------------------------------------------------*/
	//当程序开启后不能显示窗口时,请将以下代码设为非注释
	//InitCommonControls ( ) ;
	/*------------------------------------------------*/
	hInst = hInstance ;
	//Mask只用于调试时使用
	int Mask = DialogBox ( hInstance , ( LPCTSTR )IDD_MACSHOW , NULL , ( DLGPROC ) WndProc ) ;
//	Mask = Mask ;
//	Mask = GetLastError ( ) ;
	return 0;
}
void JustBuffer ( char * b , int n , int id )
{
	itoa ( id , b , 10 );
}
void Refresh ( HWND hWnd )  
{
	int i ;
	char time [ 10 ] ;
	char buffer [ ] = "Machine 000" ;
	//获得显示台
	HWND subWnd1 ;
	HWND subWnd2 ;
	subWnd1 = GetDlgItem ( hWnd , IDC_SHOW ) ;
	subWnd2 = GetDlgItem ( hWnd , IDC_ASHOW ) ;
	up.SetHWND ( subWnd1 ) ;
	down.SetHWND ( subWnd2 ) ;
	/*-----------------------------------------------------------*/
	//刷新上显示台
	//刷新机器数目
	if ( wp.macnum() != up.column_num -1 )
	{
		while ( up.column_num != 1 )
		{	up.DelColumn ( 1 ) ;
		}
		for ( i = 0 ; i < wp.macnum() ; i ++ )
		{
			JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
			up.AddColumn ( buffer , 11 , up.column_num , 95 ) ;
		}
	}
	//刷新正在运行消息
	for ( i = 1 ; i < up.column_num ; i ++ )
	{		
		JustBuffer ( time , 10 , wp.doer_inf ( i - 1 ) ->Get_rTime ( ) ) ;
		up.AddValueItem ( time , 10 , 0 , i ) ;
	}
	/*-----------------------------------------------------------*/
	//刷新下显示台
	//刷新机器数目
	if ( wp.macnum() != down.column_num -1 )
	{
		while ( down.column_num != 1 )
		{	down.DelColumn ( 1 ) ;
		}
		for ( i = 0 ; i < wp.macnum() ; i ++ )
		{
			JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
			down.AddColumn ( buffer , 11 , down.column_num , 95 ) ;
		}
	}
	/*--------------------------------------*/
	//矫正下显示台任务数
	int tn = wp.MostTaskMac ( ) ;
	while ( tn < down.item_num -1 )
		down.DelItem ( down.item_num - 1 ) ;
	while ( tn > down.item_num - 1 )
	{	strcpy ( time , "task 0" ) ;
		JustBuffer ( &time [ 5 ] , 1 , down.item_num ) ;
		down.AddFirstItem ( time , 10 , down.item_num ) ;
	}
	/*--------------------------------------*/
	//刷新各机器任务信息
	for ( i = 0 ; i < wp.macnum ( ) ; i++ )
	{
		//刷新机器i的信息
		//对应column(i+1)的信息
		//清除原信息
		for ( tn = 0 ; tn < down.item_num ; tn ++ )
			down.AddValueItem ( "" , 1 , tn , i + 1 ) ;
		//添加新信息
		task * bList = wp.doer_inf ( i ) ->get_bList ( ) ;
		bList = bList ->next ;
		//刷新总任务时间信息
		JustBuffer ( time , 10 , wp.doer_inf ( i ) ->all_time ) ;
		down.AddValueItem ( time , 10 , 0 , i + 1 ) ;
		//刷新详细任务时间信息
		for ( tn = 0 ; tn < wp.doer_inf ( i )->get_tasknum ( ) ; tn ++ ) 
		{
			if ( bList != NULL )
			{
				JustBuffer ( time , 10 , bList ->time ) ;
				down.AddValueItem ( time , 10 , tn + 1 , i + 1 ) ;
				bList = bList ->next ;
			}
		}
	}
	
	/*-----------------------------------------------------------*/
	
}
void InitDialog ( HWND hWnd )
{
//	HWND subWnd ;
	InitShow ( hWnd ) ;
}
bool InitShow ( HWND hWnd ) 
{
	HWND subWnd1 ;
	HWND subWnd2 ;
	int i ;
	int mac_num = wp.macnum ( ) ;
	char buffer [ ] = "Machine 000" ;
	char time [ 10 ] = "00000000" ;
//	int id ;
	subWnd1 = GetDlgItem ( hWnd , IDC_SHOW ) ;
	subWnd2 = GetDlgItem ( hWnd , IDC_ASHOW ) ;
	up.SetHWND ( subWnd1 ) ;
	down.SetHWND ( subWnd2 ) ;
	/*----------------------------------------------*/
	//初始化上显示台
	up.AddColumn ( "Content" , 7 , up.column_num , 85 ) ;
	up.AddFirstItem ( "RestTime:" , 9 , up.item_num ) ;
	for ( i = 0 ; i < mac_num ; i ++ )
	{
		JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
		JustBuffer ( time , 10 , wp.doer_inf ( i ) ->doing.time ) ;
		up.AddColumn ( buffer , 11 , up.column_num , 95 ) ;
		up.AddValueItem ( time , 10 , 0 , up.column_num - 1  ) ;
	}
	/*----------------------------------------------*/
	//初始化下显示台
	buffer [ 8 ] = '0' ;
	down.AddColumn ( "Content" , 7 , up.column_num , 85 ) ;
	down.AddFirstItem ( "Total:" , 5 , down.item_num ) ;
	for ( i = 0 ; i < mac_num ; i ++ )
	{
		JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
		JustBuffer ( time , 10 , wp.doer_inf ( i ) ->all_time ) ;
		down.AddColumn ( buffer , 11 , down.column_num , 95 ) ;
		down.AddValueItem ( time , 10 , 0 , down.column_num - 1 ) ;
	}
	//写入具体任务
	strcpy ( buffer , "Task 0" ) ;
	for ( i = 0 ; i < wp.MostTaskMac ( ) ; i ++ )
	{
		JustBuffer ( &buffer [ 5 ] , 1 , i  ) ;
		
	}
	
	/*----------------------------------------------*/

    return TRUE; 
}

LRESULT CALLBACK WndProc ( HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam )
{
	/***************************************************************/
	switch ( message )
	{
	case WM_INITDIALOG :
		{
			InitDialog ( hWnd ) ;
		}
	case WM_COMMAND :		//各类控件消息
		{
			switch ( LOWORD ( wParam ) )
			{
			case IDOK:
				break ;
			case IDCANCEL :									//退出
				EndDialog ( hWnd , LOWORD ( wParam ) ) ;
				break ;
			case IDC_ATASK_TIME :
				{
					if ( HIWORD (wParam) == EN_UPDATE )		//响应EN_UPDATE事件
					{
						if ( !AddTask ( hWnd ) )
						{	MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
						}
					}
				}
				break ;
			case IDC_ADD :									//添加任务
				{
					if ( !AddTask ( hWnd ) )
					{
						MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
					}
				}
				break ;
			case IDC_CLEAR :								//清除所有任务
				wp.clear ( ) ;
				Refresh ( hWnd ) ;
				break ;
			case IDC_DTASK_TIME :
				{
					if ( HIWORD (wParam) == EN_UPDATE )		//响应EN_UPDATE事件
						{
							if ( !DelTask ( hWnd , IDC_DTASK_TIME ) )
							{	MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
							}
						}
				}
				break ;
			case IDC_MAC_NUM :
				{
					if ( HIWORD (wParam) == EN_UPDATE )		//响应EN_UPDATE事件
						{
							if ( !DelTask ( hWnd , IDC_MAC_NUM ) )
							{	MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
							}
						}
				}
				break ;
			case IDC_DELETE :						//删除任务事件
				{
					if ( !DelTask ( hWnd , IDC_MAC_NUM ) )
					{	MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
					}
				}
				break ;
			case IDC_MAC :							//改变机器数文本栏修改事件
				{
					if ( HIWORD ( wParam ) == EN_UPDATE ) 
					{
						if ( !ChangeMac ( hWnd ) )
							MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;

					}
				}
				break ;
			case IDC_CHANGE :						//改变机器数目
				{
					if ( !ChangeMac ( hWnd ) )
						MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
				}
				break ;
			case IDC_WORK :							//开启机器作业
				{
					deal_work ( hWnd ) ;
				}	
			default :
				break ;
			}
		}
		
	}
	return 0 ;
}
//定义定时器中断回调函数的原型
VOID CALLBACK MyTimerProc ( HWND hWnd , UINT uMsg , UINT idEvent , DWORD dwTime ) 
{
	if ( !wp.is_work )
	{//停止工作
		//设置事件按钮文本
		HWND subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
		SetWindowText ( subWnd , "Working" ) ;
		wp.Set_Conduct ( false ) ;
		//关闭定时器,停止模拟工作
		KillTimer ( hWnd , WM_MYTIMER ) ;
		return ;
	}
			
	wp.OneStep ( ) ;
	Refresh ( hWnd ) ;
	//检查是否所有任务都完成
	wp.CountTotal ( ) ;
	if ( wp.total == 0 )
	{
		//停止工作
		//设置事件按钮文本
		HWND subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
		SetWindowText ( subWnd , "Working" ) ;
		wp.Set_Conduct ( false ) ;
		//关闭定时器,停止模拟工作
		KillTimer ( hWnd , WM_MYTIMER ) ;
		//发送消息
		MessageBox ( hWnd , "^_^All Task Have Done!!!^_^" ,"It's good news!" , IDOK ) ;
	}
}
//处理车间工作开关事件
void deal_work ( HWND hWnd )
{
	//获得该事件对象的句柄
	HWND subWnd ;
	subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
	/*--------------------------------------------------*/
	if ( !wp.is_work )
	{//开始工作
		//设置事件按钮文本
		SetWindowText ( subWnd , "Stop Working" ) ;
		wp.Set_Conduct ( true ) ;
		//开启定时器,模拟工作
		SetTimer ( hWnd , WM_MYTIMER , ELAPSE , MyTimerProc ) ;
	}	
	else
	{//停止工作
		//设置事件按钮文本
		SetWindowText ( subWnd , "Working" ) ;
		wp.Set_Conduct ( false ) ;
		//关闭定时器,停止模拟工作
		KillTimer ( hWnd , WM_MYTIMER ) ;
	}

}
//改变车间机器数目
bool ChangeMac ( HWND hWnd )
{
	HWND subWnd = GetDlgItem ( hWnd , IDC_MAC ) ;
	char buffer [ 10 ] ;
	int i ;
	GetWindowText ( subWnd , buffer , 10 ) ;
	// 检查是否完成输入
	if ( !InputReturn ( subWnd , IDC_MAC , buffer , 10 ) )
		return true ; //返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
	/*------------------------------------------------------------------*/
	//检查输入是否合法
	for ( i = 0 ; i < 10 && buffer [ i ] != 0 ; i ++ )
	{
		if ( buffer [ i ] < '0' || buffer [ i ] > '9' )
			return false ;//输入不合法
	}
	/*-------------------------------------------------------------------*/
	//改变机器数目
	int tmp = atoi ( buffer ) ;
	if ( tmp <= 0 || tmp > 340 ) 
	{
		MessageBox ( hWnd , "Please input a number between 0 - 340" , "Input Error" , IDOK );
		return true ;
	}
	wp.SetMacNum ( tmp ) ;
	Refresh ( hWnd ) ;
	return true ;
}
bool DelTask ( HWND hWnd , int id )
{
	if ( id != IDC_MAC_NUM && id != IDC_DTASK_TIME )
		return true ;
	HWND subWnd ;
	subWnd = GetDlgItem ( hWnd , id ) ;
	HWND otherWnd ;
	if ( id == IDC_MAC_NUM )
		otherWnd = GetDlgItem ( hWnd , IDC_DTASK_TIME ) ;
	else 
		otherWnd = GetDlgItem ( hWnd , IDC_MAC_NUM ) ;
	char buf [ 10 ] = "" ;
	char obuf [ 10 ] = "" ;
	int i = 0 ;
	GetWindowText ( otherWnd , obuf , 10 ) ;

	/*-----------------------------------------------------------------*/
	//检查是否完成输入
	if ( !InputReturn ( subWnd , id , buf , 10 ) )
		return true ; //返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
	/*-----------------------------------------------------------------*/
	//检查输入是否合法
	for ( i = 0 ; i < 10 && buf [ i ] != 0 ; i ++ )
	{
		if ( buf [ i ] < '0' || buf [ i ] > '9' )
		{	
			return false ;
		}
	}
	for ( i = 0 ; i < 10 && obuf [ i ] != 0 ; i ++ )
	{
		if ( obuf [ i ] < '0' || obuf [ i ] > '9' )
		{
			return false ;
		}
	}
	/*-----------------------------------------------------------------*/
	SetWindowText ( subWnd , "" ) ;
	SetWindowText ( otherWnd , "" ) ;
	//进行删除操作
	int tmp = atoi ( buf ) ;
	int otmp = atoi ( obuf ) ;
	//排除无效数据
	if ( tmp >= wp.macnum ( ) && id == IDC_MAC_NUM ) 
		return true ;	
	else if ( otmp >= wp.macnum ( ) && id == IDC_DTASK_TIME ) 
		return true ;
	//删除任务
	if ( id == IDC_MAC_NUM )
		wp.del_task ( tmp , otmp ) ;
	else
		wp.del_task ( otmp , tmp ) ;
	//优化任务分配
	wp.get_optimize ( ) ;
	//刷新显示台
	Refresh ( hWnd ) ;
	return true ;
}
bool AddTask ( HWND hWnd )
{
	//检查是否完成输入
	char buffer [ 10 ] = "";
	int i = 0 ;	
	HWND subWnd ;
	subWnd = GetDlgItem ( hWnd , IDC_ATASK_TIME ) ;
	/*----------------------------------------------------------*/
	if ( !InputReturn ( subWnd , IDC_ATASK_TIME , buffer , 10 ) )
		return true ;//返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
	/*----------------------------------------------------------*/
	//检查输入是否合法
	for ( i = 0 ; i < 10 && buffer [ i ] != 0 ; i ++ )
		if ( buffer [ i ] < '0' || buffer [ i ] > '9' )
		{
			SetWindowText ( subWnd , buffer ) ;
			return false;//返回输入不合法
		}
	/*----------------------------------------------------------*/
	//添加任务
	int temp = atoi ( buffer ) ;
	if ( temp == 0 )//无意义任务
		return true ;
	task tmp ;
	tmp.time = temp ;
	wp.add_task ( tmp ) ;
	//优化任务分配
	wp.get_optimize ( ) ;
	//刷新显示台
	Refresh ( hWnd ) ;
	return true ;
}

bool InputReturn ( HWND subWnd , int ID , char * buffer , int n )
{
	int oldNum ;
	static int oldNum0 = 0 ;	//如果文本框中两次字符数目一致,则认为有回车键被按下
	static int oldNum1 = 0 ;
	static int oldNum2 = 0 ;
	static int oldNum3 = 0 ;
	switch ( ID )
	{
	case IDC_ATASK_TIME :
		oldNum = oldNum0 ;
		break ;
	case IDC_DTASK_TIME :
		oldNum = oldNum2 ;
		break ;
	case IDC_MAC_NUM :
		oldNum = oldNum1 ;
		break ;
	case IDC_MAC :
		oldNum = oldNum3 ;
		break ;
	default :
		return false ;
	}
	GetWindowText ( subWnd , buffer , n ) ;
	//如果本次内容长度和上次内容长度一致,则认为用户按下了回车键
	if ( (unsigned)oldNum != strlen ( buffer ) )
	{
		oldNum = strlen ( buffer ) ;
			switch ( ID )
			{
			case IDC_ATASK_TIME :
				oldNum0 = oldNum ;
				break ;
			case IDC_DTASK_TIME :
				oldNum2 = oldNum ;
				break ;
			case IDC_MAC_NUM :
				oldNum1 = oldNum ;
				break ;
			case IDC_MAC :
				oldNum3 = oldNum ;
				break ;
			default :
				return false ;
			}
		return false ;
	}
	//清空文本框内容
	SetWindowText ( subWnd , "" ) ;
	//重置上一次内容长度
	switch ( ID )
	{
	case IDC_ATASK_TIME :
		oldNum0 = 0;
		break ;
	case IDC_DTASK_TIME :
		oldNum2 = 0 ;
		break ;
	case IDC_MAC_NUM :
		oldNum1 = 0;
		break ;
	case IDC_MAC :
		oldNum3 = 0 ;
		break ;
	default :
		return false ;
	}
	return true ;

}

⌨️ 快捷键说明

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