主题:高手帮我看看这题目怎么做?~
题目大概意思是:要求实现两个任务之间的相互控制。要求建立一个主进程,实现对两个进程的管理。要求使用CreateProcess、PROCESS_DLL、ShowWindow,还要求主进程响应自定义消息…………我是个初学者,老师给的一堆参数之类的完全看不懂。谁能告诉我这个主进程怎么做啊~
<<WindowsNT系统下实时动态模拟环境>>项目
实时动态模拟环境是一个基于WindoWsNT系统下的实时多任务应用软件的运行平台。该软件通过使用NT系统的现有资源,在主模拟计算机中实现多任务的建立、调度管理、删除、以及各任务间的数据共享,通过以太网实现与外围计算机的实时数据交换,在其中一个任务中实现用户可自定义的图形用户界面;整个软件系统功能可以分为以下几个部分:多任务的建立、调度管理、删除;多任务间的数据共享;以太网的实时通信;用户可自定义的图形用户界面。
一 多任务和数据共享
一) WindowsNT系统下实时动态模拟环境中多任务的控制
WindowsNT系统下实时动态模拟环境中多任务通过进程实现,多任务之间的控制通过对它的线程的控制完成,利用与主控进程通信的方法实现。各个任务中的应用程序通过一些简单的函数调用实现对本任务或其他任务运行状态的控制。控制任务包括挂起、唤醒、终止、改变优先级等。该方法简便、实用、高效,动态性好。
1进程和线程
进程是指在系统中正在运行的一个应用程序 ;进程是程序在一个数据集合上的运行过程,它具有动态、并行、独立、异步等特性;一个进程将唯一地对应于一个EXE文件。
线程是系统分配处理器时间资源的基本单元 ,或者说进程之内独立执行的一个单元。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,这些线程都共享该进程的地址空间,它们可以并行、异步地执行。
在Windows中,“多任务”是基于线程而不是基于进程的。多任务执行是指在同一台计算机系统的同一时刻运行多个程序。在Windows 中,采用了一种所谓带优先权的多任务方式来运行应用程序,称为“抢先式多任务”。实际上就是抢先式多线程执行。
WindowsNT系统下实时动态模拟环境中的实时多任务是指在NT系统下通过进程或线程(或其它现有系统资源)实现的。具有不同优先级的、独立运行的、用户开发的应用程序。它们可以是不同的开发语言的应用程序,如VB、DELPHI、C++BUILDER、VC++等。
2 实时多任务的建立
多任务的建立是 利用主控进程通过使用NT的系统服务资源实现,在建立任务的同时应指定各任务的优先级,其中两个任务(核心任务)的优先级应高于系统页面管理任务的优先级,其余各任务的优先级应低于以上任务。每次实时模拟运行过程中所建立的任务及其对应的优先级,由一个用户可修改的文本格式数据文件进行定义,定义的格式为:
应用程序1的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
应用程序2的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
...
应用程序n的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
各个多任务在模拟环境中是作为子进程对待的,主进程需要先定义子进程的标识, 如
PROCESS_INFORMATION process_id[10];
主进程创建子进程时调用标准函数:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
其中第6个参数:dwCreationFlags,可以控制创建进程时的状态:如实参为 CREATE_SUSPENDED,则表示创建的进程是挂起状态,并没有被立即执行,直到该进程被唤醒。 该参数也能控制创建进程的优先级:实参也可以是HIGH_PRIORITY_CLASS、IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、REALTIME_PRIORITY_CLASS;实参还可以是两种情况的综合:即可以控制状态,也可以控制优先级。
实际调用如 :
CreateProcess("*****.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED|NORMAL_PRIORITY_CLASS,NULL,".",&si,&process_id[0]);
3 多任务的调度管理
各任务中的应用程序通过一些简单的函数调用实现对本任务或其他任务运行状态的控制,任务的基本状态包括:运行、睡眠、挂起、等待事件标志、终止等。各个任务是主进程下的子进程,子进程之间是不能够直接进行相互控制的,子进程只有通过发对应的控制消息给主进程,然后由主进程再对某个子进程进行控制。因此,主进程要响应自定义消息,并根据参数执行相应的操作。要注意的是,对进程的控制是通过对它的线程的控制完成的。
3.1 子进程发对应的控制消息给主进程
定义动态链接库PROCESS_DLL,提供函数ControlProcess(...),其中参数为:
szParentWindowClass为父进程窗口注册类,
szParentWindowTitle为父进程窗口标题,二者至少有一个必须不为NULL
wControlType为控制类型
wNum为数组序号
dwPriorityClass为优先级类,可以取以下四个值:
HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
函数的定义如下:
BOOL ControlProcess(LPCTSTR szParentWindowClass,LPCTSTR szParentWindowTitle,WORD ype,WORD wNum,DWORD dwPriorityClass)
{
//获得副窗口句柄
HWND hParent=FindWindow(szParentWindowClass,szParentWindowTitle);
if(hParent==NULL) return FALSE;
//发送消息
SendMessage(hParent,WM_USER+1,MAKWPARAM(wNum,wControlType),(LPARAM)dwPriorityClass);
return TRUE;
}
应用程序实际调用该函数时:
第一个参数为空NULL,
第二个为父窗口的标题"app",
第三个参数为整数,0--挂起进程,
1--唤醒进程
2--设置进程的优先级
3--终止进程
第四个参数为进程的代号(从0 开始,依次递增)
第五个参数为要设置的进程的优先级
3.2主进程响应自定义消息
主进程响应自定义消息WM_USER+1,并根据参数执行相应的操作:
WORD wType=wParam>>16; //获得控制类型
WORD wNum=(wParam<<16)>>16; //获得数组序号
DWORD dwPriorityClass=lParam; //获得优先级类型
switch(wType)
{
case 0: //挂起第wNum个子进程
SuspendThread(pi[wNum].hThread);
break;
case 1: //唤醒第wNum个子进程
ResumeThread(pi[wNum].hThread);
break;
case 2: //设置第wNum个进程的优先级
SetPriorityClass(pi[wNum].hProcess,dwPriorityClass);
break;
case 3: //终止第wNum个子进程
TerminateThread(pi[wNum].hThread,exitcode);
break;
}
4. 隐藏主进程的窗口
在模拟环境中,主进程的窗口是不需要显示的,可以调用系统函数ShowWindow(hWnd, SW_MINIMIZE|nCmdShow)将父窗口最小化。
5 总结
通过主控进程的方法实现WindowsNT系统下实时动态模拟环境中多任务相互之间的控制,是一种简便、实用的多任务的控制方式,各个任务之间可以通过简单的函数调用完成相互间的调度控制。
<<WindowsNT系统下实时动态模拟环境>>项目
实时动态模拟环境是一个基于WindoWsNT系统下的实时多任务应用软件的运行平台。该软件通过使用NT系统的现有资源,在主模拟计算机中实现多任务的建立、调度管理、删除、以及各任务间的数据共享,通过以太网实现与外围计算机的实时数据交换,在其中一个任务中实现用户可自定义的图形用户界面;整个软件系统功能可以分为以下几个部分:多任务的建立、调度管理、删除;多任务间的数据共享;以太网的实时通信;用户可自定义的图形用户界面。
一 多任务和数据共享
一) WindowsNT系统下实时动态模拟环境中多任务的控制
WindowsNT系统下实时动态模拟环境中多任务通过进程实现,多任务之间的控制通过对它的线程的控制完成,利用与主控进程通信的方法实现。各个任务中的应用程序通过一些简单的函数调用实现对本任务或其他任务运行状态的控制。控制任务包括挂起、唤醒、终止、改变优先级等。该方法简便、实用、高效,动态性好。
1进程和线程
进程是指在系统中正在运行的一个应用程序 ;进程是程序在一个数据集合上的运行过程,它具有动态、并行、独立、异步等特性;一个进程将唯一地对应于一个EXE文件。
线程是系统分配处理器时间资源的基本单元 ,或者说进程之内独立执行的一个单元。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,这些线程都共享该进程的地址空间,它们可以并行、异步地执行。
在Windows中,“多任务”是基于线程而不是基于进程的。多任务执行是指在同一台计算机系统的同一时刻运行多个程序。在Windows 中,采用了一种所谓带优先权的多任务方式来运行应用程序,称为“抢先式多任务”。实际上就是抢先式多线程执行。
WindowsNT系统下实时动态模拟环境中的实时多任务是指在NT系统下通过进程或线程(或其它现有系统资源)实现的。具有不同优先级的、独立运行的、用户开发的应用程序。它们可以是不同的开发语言的应用程序,如VB、DELPHI、C++BUILDER、VC++等。
2 实时多任务的建立
多任务的建立是 利用主控进程通过使用NT的系统服务资源实现,在建立任务的同时应指定各任务的优先级,其中两个任务(核心任务)的优先级应高于系统页面管理任务的优先级,其余各任务的优先级应低于以上任务。每次实时模拟运行过程中所建立的任务及其对应的优先级,由一个用户可修改的文本格式数据文件进行定义,定义的格式为:
应用程序1的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
应用程序2的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
...
应用程序n的可执行文件的文件名(包含路径) 创建该进程的状态和优先级
各个多任务在模拟环境中是作为子进程对待的,主进程需要先定义子进程的标识, 如
PROCESS_INFORMATION process_id[10];
主进程创建子进程时调用标准函数:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
其中第6个参数:dwCreationFlags,可以控制创建进程时的状态:如实参为 CREATE_SUSPENDED,则表示创建的进程是挂起状态,并没有被立即执行,直到该进程被唤醒。 该参数也能控制创建进程的优先级:实参也可以是HIGH_PRIORITY_CLASS、IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、REALTIME_PRIORITY_CLASS;实参还可以是两种情况的综合:即可以控制状态,也可以控制优先级。
实际调用如 :
CreateProcess("*****.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED|NORMAL_PRIORITY_CLASS,NULL,".",&si,&process_id[0]);
3 多任务的调度管理
各任务中的应用程序通过一些简单的函数调用实现对本任务或其他任务运行状态的控制,任务的基本状态包括:运行、睡眠、挂起、等待事件标志、终止等。各个任务是主进程下的子进程,子进程之间是不能够直接进行相互控制的,子进程只有通过发对应的控制消息给主进程,然后由主进程再对某个子进程进行控制。因此,主进程要响应自定义消息,并根据参数执行相应的操作。要注意的是,对进程的控制是通过对它的线程的控制完成的。
3.1 子进程发对应的控制消息给主进程
定义动态链接库PROCESS_DLL,提供函数ControlProcess(...),其中参数为:
szParentWindowClass为父进程窗口注册类,
szParentWindowTitle为父进程窗口标题,二者至少有一个必须不为NULL
wControlType为控制类型
wNum为数组序号
dwPriorityClass为优先级类,可以取以下四个值:
HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
函数的定义如下:
BOOL ControlProcess(LPCTSTR szParentWindowClass,LPCTSTR szParentWindowTitle,WORD ype,WORD wNum,DWORD dwPriorityClass)
{
//获得副窗口句柄
HWND hParent=FindWindow(szParentWindowClass,szParentWindowTitle);
if(hParent==NULL) return FALSE;
//发送消息
SendMessage(hParent,WM_USER+1,MAKWPARAM(wNum,wControlType),(LPARAM)dwPriorityClass);
return TRUE;
}
应用程序实际调用该函数时:
第一个参数为空NULL,
第二个为父窗口的标题"app",
第三个参数为整数,0--挂起进程,
1--唤醒进程
2--设置进程的优先级
3--终止进程
第四个参数为进程的代号(从0 开始,依次递增)
第五个参数为要设置的进程的优先级
3.2主进程响应自定义消息
主进程响应自定义消息WM_USER+1,并根据参数执行相应的操作:
WORD wType=wParam>>16; //获得控制类型
WORD wNum=(wParam<<16)>>16; //获得数组序号
DWORD dwPriorityClass=lParam; //获得优先级类型
switch(wType)
{
case 0: //挂起第wNum个子进程
SuspendThread(pi[wNum].hThread);
break;
case 1: //唤醒第wNum个子进程
ResumeThread(pi[wNum].hThread);
break;
case 2: //设置第wNum个进程的优先级
SetPriorityClass(pi[wNum].hProcess,dwPriorityClass);
break;
case 3: //终止第wNum个子进程
TerminateThread(pi[wNum].hThread,exitcode);
break;
}
4. 隐藏主进程的窗口
在模拟环境中,主进程的窗口是不需要显示的,可以调用系统函数ShowWindow(hWnd, SW_MINIMIZE|nCmdShow)将父窗口最小化。
5 总结
通过主控进程的方法实现WindowsNT系统下实时动态模拟环境中多任务相互之间的控制,是一种简便、实用的多任务的控制方式,各个任务之间可以通过简单的函数调用完成相互间的调度控制。