Разработать многопоточное приложение для копирования и сравнения больших по размеру файлов с возможность приостановки процессов, вывода информации о текущем состоянии процессов (аналог Task Manager Windows).
Заказать уникальную курсовую работу- 16 16 страниц
- 0 + 0 источников
- Добавлена 30.06.2009
- Содержание
- Часть работы
- Список литературы
- Вопросы/Ответы
Введение………………………………………………………………………...4
1. Анализ поставленной задачи.………………….………..…………………..5
2. Метод решения………………………………………………………………7
3. Описание программы.…………….................................................................8
3.1 CChooseDirDlg ….………………………………………………….......8
3.2 CCProcess ……………………………………………………………….8
3.3 CDirectoryTree …………………………………………………………..8
3.4 CDriveCombo …………………………………………………………....9
3.5 CMultithreadDlg………………………………………………………...10
4. Руководство пользователя…………………………………………………12
4.1 – Системные требования……………………………………………...12
4.2 – Инструкция по инсталляции и эксплуатации программы……….12
5. Результаты разработки……………………………………………………..14
Заключение….....................................................................................................15
Приложение……………………………………………………………………16
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
AfxMessageBox("Error for takes all processes");
// Fill in the size of the structure before using it.
process=TRUE; stream=FALSE;
pe32.dwSize = sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process,
// display information.
CListCtrl * listctrl = (CListCtrl*)GetDlgItem(IDC_LIST2);
//m_listctrl.DeleteAllItems();
//m_listctrl.GetClientRect(&rect);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(pr_Id != pe32.th32ProcessID)
{
sprintf(str2,"%s",pe32.szExeFile);
listctrl->InsertItem(i,str2);
sprintf(str2,"%u",pe32.th32ProcessID);
listctrl->SetItemText(i,1,str2);
sprintf(str2,"%u",pe32.th32DefaultHeapID);
listctrl->SetItemText(i,2,str2);
sprintf(str2,"%u",pe32.cntUsage);
listctrl->SetItemText(i,3,str2);
sprintf(str2,"%u",pe32.th32ModuleID);
listctrl->SetItemText(i,4,str2);
sprintf(str2,"%u",pe32.cntThreads);
listctrl->SetItemText(i,5,str2);
sprintf(str2,"%u",pe32.th32ParentProcessID);
listctrl->SetItemText(i,6,str2);
sprintf(str2,"%u",pe32.pcPriClassBase);
listctrl->SetItemText(i,7,str2);
i++;
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of processes
// Do not forget to clean up the snapshot object.
CloseHandle (hProcessSnap);
}
//реализация функций обмена данных с диалоговым окном
void CCProcess::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCProcess)
DDX_Control(pDX, IDC_LIST2, m_listctrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCProcess, CDialog)
//{{AFX_MSG_MAP(CCProcess)
ON_BN_CLICKED(IDC_Thread, OnKillProcess)
ON_BN_CLICKED(IDEXIT, OnRefresh)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Завершить процесс.
void CCProcess::OnKillProcess()
{
CListCtrl * listctrl = (CListCtrl*)GetDlgItem(IDC_LIST2);
int iItem= listctrl->GetNextItem(-1,LVNI_SELECTED);
int item_count=0;
pr_Id = -1;
while(iItem!=-1)
{
item_count++;
iItem = listctrl->GetNextItem(iItem,LVNI_SELECTED);
}
if(item_count!=0)
{
for(int i=0;i
{
if(listctrl->GetItemState(i,LVIS_SELECTED)&LVIS_SELECTED)
{
int Response =
MessageBox("Вы уверены что хотите завершить этот процесс"
"",
"Предупреждение",
MB_OKCANCEL|MB_ICONASTERISK);
if( Response == IDOK )
{
char strLong[90];
sprintf(strLong,"%s",listctrl->GetItemText(i,1));
long lVar = 0;
lVar = strtol(strLong,NULL,10);
HANDLE hHandle;
DWORD dwExitCode = 0;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS,0,lVar);
::GetExitCodeProcess(hHandle,&dwExitCode);
::TerminateProcess(hHandle,dwExitCode);
pr_Id = lVar;
break;
}
}
}
}
else
AfxMessageBox("Вы не выбрали процесс из списка.");
listctrl->DeleteAllItems();
OnCreateToolhelp32Snapshot();
UpdateData(TRUE);
}
void CCProcess::OnRefresh()
{
CListCtrl * listctrl = (CListCtrl*)GetDlgItem(IDC_LIST2);
listctrl->DeleteAllItems();
OnCreateToolhelp32Snapshot();
UpdateData(TRUE);
}
#include "stdafx.h"
#include "DriveCombo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// Definitions
#define MAX_BUFFER 1024 // Maximum buffer size
/////////////////////////////////////////////////////////////////////////////
// CDriveCombo
CDriveCombo::CDriveCombo()
{
}
CDriveCombo::~CDriveCombo()
{
}
BEGIN_MESSAGE_MAP(CDriveCombo, CComboBox)
//{{AFX_MSG_MAP(CDriveCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDriveCombo message handlers
/****************************************************************************
Функция: Initialize()
цель: Читает диски в Операционной системе и заполняется сам по себе ими.
Ввод: None
Вывод: BOOL -- Была ли операция успешна или нет.
****************************************************************************/
BOOL CDriveCombo::Initialize()
{
BOOL bFound = FALSE; // Whether volume info was found or not
DWORD dwRes = 0; // Receives the drive bitmask
int i = 0; // Misc. counter variable
CString str; // Used for string manipulations
char szVolInfo[MAX_BUFFER];
char szDrives[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
// Get the bitmask of available drives
dwRes = GetLogicalDrives();
if (0 == dwRes)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox((LPTSTR)lpMsgBuf, "GetLastError - GetLogicalDrives failed", MB_OK|MB_ICONERROR);
LocalFree(lpMsgBuf);
return FALSE;
}
// Separate out each drive letter and add it to the Combo Box
while (dwRes)
{
if (dwRes & 1)
{
// There's a drive for this bit position.
str.Format("%c: ", szDrives[i]);
// Get the name of the drive, if it exists
SetErrorMode(SEM_FAILCRITICALERRORS);
bFound = GetVolumeInformation(str, szVolInfo, MAX_BUFFER, NULL, NULL, NULL, NULL, NULL);
if (bFound)
str += szVolInfo;
// Add the drive information to the combo box
AddString(str);
}
dwRes >>= 1;
i++;
}
// Get the current directory, so we know what to highlight.
dwRes = GetCurrentDirectory(MAX_BUFFER, szVolInfo);
if (0 == dwRes)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox((LPTSTR)lpMsgBuf, "GetLastError - GetCurrentDirectory failed", MB_OK|MB_ICONERROR);
LocalFree(lpMsgBuf);
return FALSE;
}
str.Format("%c", szVolInfo[0]);
i = FindString(-1, str);
SetCurSel(i);
return TRUE;
}
/****************************************************************************
Функция: IsDriveReady()
цель: Тестирует если указанный диск готов.
Ввод: int nIndex -- Диск для теста
Вывод: BOOL -- Была ли операция успешна или нет.
****************************************************************************/
BOOL CDriveCombo::IsDriveReady(int nIndex)
{
HANDLE hFile; // Handle to found file
WIN32_FIND_DATA stFindData; // Info about the found file
CString szDrive; // Drive letter to test
CString szSearch; // Search string
CString szError; // Error message
GetLBText(nIndex, szDrive);
szSearch = szDrive.Left(1);
szSearch += ":\\*.*";
// First, see if there's anything in the directory
hFile = FindFirstFile((LPCTSTR)szSearch, &stFindData);
if (INVALID_HANDLE_VALUE == hFile)
{
szError.Format("Drive %s: is not ready.", szDrive.Left(1));
MessageBox(szError, "Error", MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
FindClose(hFile);
return TRUE;
}
/****************************************************************************
Функция: ResetDrive()
цель: Перезагружает текущий выбор к определенному букву диска.
Ввод: char cDrive -- буква диска.
Вывод: Ни один
****************************************************************************/
void CDriveCombo::ResetDrive(char cDrive)
{
CString szStr;
int nIndex = 0;
szStr.Format("%c:", cDrive);
nIndex = FindString(-1, szStr);
if (CB_ERR != nIndex)
SetCurSel(nIndex);
return;
}
21
21
Вопрос-ответ:
Какие основные функции имеет разработанное приложение?
Разработанное приложение позволяет выполнять копирование и сравнение больших по размеру файлов. Оно также обладает функцией приостановки процесса и вывода информации о текущем состоянии процессов, аналогичной Task Manager в Windows.
Какие выгоды предоставляет многопоточное приложение для копирования и сравнения файлов?
Многопоточное приложение позволяет выполнять копирование и сравнение файлов быстрее и эффективнее, так как процессы выполняются параллельно на разных потоках. Это значительно сокращает время выполнения задачи и увеличивает производительность.
Каким образом можно приостановить процесс вывода информации о текущем состоянии процессов?
Для приостановки процесса вывода информации о текущем состоянии процессов необходимо воспользоваться соответствующей функцией, которая будет приостанавливать поток вывода данных. Это позволит временно остановить вывод информации и возобновить его при необходимости.
Какие удобства предоставляет функция сравнения файлов в приложении?
Функция сравнения файлов в приложении позволяет определить, имеют ли файлы одинаковое содержимое, что может быть полезно при копировании или перемещении файлов. Таким образом, можно убедиться в точности процесса копирования и исключить возможность потери данных.
Какую информацию выводит приложение о текущем состоянии процессов?
Приложение выводит информацию о текущем состоянии процессов, включая информацию о загрузке центрального процессора, использовании оперативной памяти, количестве потоков и другую статистику. Это позволяет получить общую картину о работе приложения и распределении ресурсов компьютера.
Какой функционал предоставляет приложение?
Приложение позволяет копировать и сравнивать большие по размеру файлы, а также приостанавливать процессы и выводить информацию о текущем состоянии процессов.
Какие возможности есть для управления процессом копирования и сравнения файлов?
Приложение позволяет приостанавливать процессы копирования и сравнения, а также выводить информацию о текущем состоянии процессов аналогично Task Manager в Windows.
Как происходит выбор директории для копирования и сравнения файлов?
Для выбора директории используется диалоговое окно CChooseDirDlg, которое позволяет выбрать нужную директорию.
Какая структура программы и какие классы используются?
Программа состоит из классов CChooseDirDlg и CCProcess. Класс CChooseDirDlg отвечает за диалоговое окно выбора директории, а класс CCProcess отвечает за процессы копирования и сравнения файлов.