Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №7 / 7 / lab7
.cpp#include "stdafx.h"
using namespace std;
BOOL GetProcessList();
void printError(TCHAR*);
BOOL GetProcessThreads();
BOOL ListProcessThreads(DWORD);
int a;
char* i="ID";
int _tmain(int argc, _TCHAR* argv[])
{
system("cls");
cout<<"\n The seventh laboratory work "<<endl;
cout<<" Threads and processes research"<<endl;
getch();
do
{
system("cls");
cout<<"\n Menu\n"<<endl;
cout<<" 1.Processes sorting in decreasing order of priority"<<endl;
cout<<" 2.Threads sorting in decreasing order of priority"<<endl;
cout<<" 3.Exit"<<endl;
do
{
cout<<"\n Vibirite punkt menu:"<<endl;
fflush(stdin);
cin>>a;
if(a<0||a>3)
{
cout<<"\n Vi dopustili oshibku!!!(1-3)"<<endl;
getch();
}
}
while(a<0||a>3);
switch(a)
{
case 1:
{
GetProcessList();
break;
}
case 2:
{
GetProcessList();
GetProcessThreads();
break;
}
}
}
while(a!=3);
return 0;
}
BOOL GetProcessList()
{
int p=0;
LONG temp;
system("cls");
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
PROCESSENTRY32 proc[50];
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printError("CreateToolhelp32Snapshot(of processes)");
return(FALSE);
}
pe32.dwSize = sizeof( PROCESSENTRY32);
if(!Process32First(hProcessSnap,&pe32))
{
printError("Process32First");
CloseHandle(hProcessSnap);
return(FALSE);
}
do
{
proc[p]=pe32;
p++;
}
while(Process32Next(hProcessSnap,&pe32));
for(int q=1;q<p;q++)
{
for(int r=0;r<p-1;r++)
{
if(proc[r].pcPriClassBase>proc[r+1].pcPriClassBase)
{
temp=proc[r].pcPriClassBase;
proc[r].pcPriClassBase=proc[r+1].pcPriClassBase;
proc[r+1].pcPriClassBase=temp;
}
}
}
for(int q=1;q<p;q++)
{
printf("PROCESS:%-25s",proc[q].szExeFile);
printf("%-3s:%-3d",i,proc[q].th32ProcessID);
printf("\tPriority Base:%d\n",proc[q].pcPriClassBase);
}
getch();
CloseHandle( hProcessSnap );
return( TRUE );
}
BOOL ListProcessThreads(DWORD dwOwnerPID)
{
int j=0;
LONG temp;
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
THREADENTRY32 te32;
THREADENTRY32 id[100];
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
if( hThreadSnap==INVALID_HANDLE_VALUE)
return( FALSE );
te32.dwSize=sizeof(THREADENTRY32);
if(!Thread32First(hThreadSnap,&te32))
{
printError("Thread32First");
CloseHandle(hThreadSnap);
return(FALSE);
}
do
{
if(te32.th32OwnerProcessID==dwOwnerPID)
{
id[j]=te32;
j++;
}
}
while(Thread32Next(hThreadSnap,&te32));
for(int k=1;k<j;k++)
{
for(int l=0;l<j-1;l++)
{
if(id[l].tpBasePri>id[l+1].tpBasePri)
{
temp=id[l].tpBasePri;
id[l].tpBasePri=id[l+1].tpBasePri;
id[l+1].tpBasePri=temp;
}
}
}
for(int k=0;k<j;k++)
{
printf("Thread ID:%-7dBase priority:%d\n",
id[k].th32ThreadID,id[k].tpBasePri);
}
CloseHandle(hThreadSnap);
return(TRUE);
}
BOOL GetProcessThreads()
{
DWORD id;
cout<<"Enter process id:";
fflush(stdin);
cin>>id;
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printError("CreateToolhelp32Snapshot(of processes)");
return( FALSE );
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnap,&pe32))
{
printError("Process32First");
CloseHandle(hProcessSnap);
return(FALSE);
}
do
{
if(id==pe32.th32ProcessID)
{
system("cls");
cout<<"Process ID:"<<pe32.th32ProcessID<<endl<<"\n";
ListProcessThreads(pe32.th32ProcessID);
}
}
while(Process32Next(hProcessSnap,&pe32));
getch();
fflush(stdin);
CloseHandle(hProcessSnap);
return(TRUE);
}
void printError(TCHAR* msg)
{
DWORD eNum;
TCHAR sysMsg[256];
TCHAR* p;
eNum = GetLastError();
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, eNum,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),sysMsg, 256, NULL );
p = sysMsg;
while((*p>31)||(*p==9))
++p;
do {*p--=0 ;}while((p>=sysMsg)&&((*p=='.')||(*p<33)));
printf("\nWARNING: %s failed with error %d (%s)",msg,eNum,sysMsg);
}