Разработка приложения с несколькими обрабатывающими файл потоками, использующими взаимоисключение на основе критической секции без блокировки частей файла
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
ATE_SUSPENDED, NULL);= CreateThread (NULL, 0,&Thread3, NULL, CREATE_SUSPENDED, NULL);
// Инициализируем окно.cbSize = sizeof(wndclass);.style = CS_HREDRAW | CS_VREDRAW;.lpfnWndProc = WndProc;.cbClsExtra = 0;.cbWndExtra = 0;.hInstance = hInstance;.hIcon = LoadIcon (NULL, IDI_APPLICATION);.hCursor = LoadCursor (NULL, IDC_ARROW);.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);.lpszMenuName = NULL;.lpszClassName = szAppName;.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
// Регистрируем окно(&wndclass);= CreateWindow (szAppName, L Курсовая работа Арбора Сергей ПЕ-01б (Вариант 27), WS_OVERLAPPEDWINDOW,_USEDEFAULT, CW_USEDEFAULT,
, 300,, NULL, hInstance, NULL);(hwnd, nCmdShow);(hwnd);
// Создаем цикл сообщений(GetMessage (&msg, NULL, 0, 0))
{(&msg);(&msg);
}
// Завершение всех потоков и семафоров при выходе
TerminateThread (hThread1, dwExitCode);(hThread2, dwExitCode);(hThread3, dwExitCode);(hThread1);(hThread2);(hThread3);
// Удаление критической секция(&cs);msg.wParam;
}APIENTRY Thread1 (PVOID lpParameter)
{(true) {k=0; // Обход массива с цветом пикселей
for (int i=0; i<100; ++i)(int j=0; j<100; ++j) {(delay); // Задержка
// Если поток выключен или пауза - пропуск итерации
if (! bThrActive[0] || pause) continue;
// Вход в критическую секцию(&cs);
// Выводим ход работы потока в соответствующую ему квадратную область
SetPixel (hdc, X1+110+j, Y1+i, RGB (155,0,0));
// Приводим тип int к COLORREFcl1 = colors[k];
COLORREF cl2 = colors [k+1];
// Если текущий пиксель содержит больше цвета по которому сортирует поток чем следующий - смена местами и перерисовка
if (GetRValue(cl1) > GetRValue(cl2))
{(hdc, X1+j, Y1+i, cl2);(hdc, X1+j+1, Y1+i, cl1);x = colors[k];[k] = colors [k+1]; [k+1] = x;
}
// Выход из критической секции
LeaveCriticalSection(&cs);
++k;
}
// Проход цикла завершен - стираем закрашенную область соответствующую данному потоку
RECT r;
r.left = X1+110;.top = Y1;.right = X2+110;.bottom = Y2;(hwnd,&r, true);
}
}APIENTRY Thread2 (PVOID lpParameter)
{(true) {k=0;(int i=0; i GetGValue(cl2)) {(hdc, X1+j, Y1+i, cl2);(hdc, X1+j+1, Y1+i, cl1);x = colors[k];[k] = colors [k+1];[k+1] = x;
}
}(&cs);
++k;
}
}
RECT r;.left = X1;.top = Y1+110;.right = X2;.bottom = Y2+110;(hwnd,&r, true);
}
}APIENTRY Thread3 (PVOID lpParameter)
{(true) {k=0;(int i=0; i GetBValue(cl2))
{(hdc, X1+j, Y1+i, cl2);(hdc, X1+j+1, Y1+i, cl1);x = colors[k];[k] = colors [k+1];[k+1] = x;
}
}(&cs);
++k;
}
}
RECT r;.left = X1+110;.top = Y1+110;.right = X2+110;.bottom = Y2+110;(hwnd,&r, true);
}
}CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{ps;HWND hCBThread[3]; // Переключатели потоковHWND hEditDelay; // Поле ввода задержки
static HWND hBtnDelay; // Кнопка установки новой задержки
static HWND hBtnPause; // Кнопка паузы_t szBuffer[100];(iMsg)
{WM_CREATE:(hwnd,&rect); // Установка Padding (отступ внутри окна).top+=10;.bottom-=10;.left+=10;.right-=10;
// Создание элементов интерфейса[0] = CreateWindow (L BUTTON, L Поток 1, BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE,rect.left, rect.top,230, 30, hwnd, (HMENU) 1, hInst, NULL);[1] = CreateWindow (L BUTTON, L Поток 2, BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE,rect.left, rect.top+25, 230, 30, hwnd, (HMENU) 2, hInst, NULL);[2] = CreateWindow (L BUTTON, L Поток 3, BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE,rect.left, rect.top+50, 230, 30, hwnd, (HMENU) 3, hInst, NULL);= CreateWindow (L EDIT, NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL|ES_LEFT,rect.left,rect.top+100, 60,30, hwnd, (HMENU) 12, hInst, NULL);= CreateWindow (L BUTTON, L Установить задержку, WS_CHILD|WS_VISIBLE,rect.left+70,rect.top+100, 160,30, hwnd, (HMENU) 13, hInst, NULL);= CreateWindow (L BUTTON, L Пауза, WS_CHILD|WS_VISIBLE,rect.left,rect.top+145, 230,30, hwnd, (HMENU) 14, hInst, NULL);
// Активация кнопок(hCBThread[0], BM_SETCHECK, 1, 0);(hCBThread[1], BM_SETCHECK, 1, 0);(hCBThread[2], BM_SETCHECK, 1, 0);(int i=0; i<3; ++i) bThrActive[i] = true;(int i=0; i<NUM; ++i) colors[i] = (COLORREF) RGB((rand()&255), (rand()&255), (rand()&255));[10000]=0;(hThread1);(hThread2);(hThread3);0;WM_PAINT:(hwnd, &rect);= BeginPaint (hwnd, &ps);hBrush;hdc;
hdc = GetDC(hwnd); = CreateSolidBrush (RGB (0, 0, 0));
// Перерисовываем исходя из текущего отсортированного массива цвета
SelectObject (hdc, hBrush);
{k=0;(int i=0; i<100; ++i)(int j=0; j<100; ++j) {(hdc, X1+i, Y1+j, colors [k++]);
}
}(hwnd, hdc);(hBrush);0;WM_SIZE:0;WM_COMMAND:(LOWORD(wParam)) {
case 1:case 2:case 3:
// Включение / Отключение выбранного потока
bThrActive [wParam-1] = (SendMessage (GetDlgItem(hwnd, wParam), BM_GETCHECK, 0, 0) == BST_CHECKED);;13: // Установка задержки= _wtoi (getText(12));;14:=! pause;;
}0;WM_DESTROY:(0);0;
}DefWindowProc (hwnd, iMsg, wParam, lParam);
}
Выводы
Процесс (задача) - программа, находящаяся в режиме выполнения. В многозадачной системе реальный процессор переключается с процесса на процесс, но для упрощения модели рассматривается набор процессов, идущих параллельно (псевдопараллельно). Каждому процессу соответствует адресное пространство и одиночный поток исполняемых команд. В многопользовательских системах, при каждом обращении к одному и тому же сервису, приходится создавать новый процесс для обслуживания клиента. Это менее выгодно, чем создать квазипараллельный поток внутри этого процесса с одним адресным пространством. Преимущества использования потоков:
Упрощение программы в некоторых случаях, за счет использования общего адресного пространства.
Быстрота создания потока, по сравнению с процессом, примерно в 100 раз.
Повышение производительности самой программы, т.к. есть возможность одновременно выполнять вычисления на процессоре и операцию ввода / вывода. Пример: текстовый редактор с тремя потоками может одновременно взаимодействовать с пользователем, форматировать текст и записывать на диск резервную копию.
Во время разработки программного продукта я изучил и применил на практике использование нескольких потоков в одном приложении. Это позволило увеличить быстродействие приложения, а также разграничить пользовательский интерфейс и обработку данных.
Также я познакомился и научился применять функции WinAPI для работы с файлами. Это также позволило увеличить быстродействие и упростить программный продукт, так как доступ к файлам осуществлялся напрямую через Windows.
В итоге был разработан конечный программный продукт, наглядно демонстрирующий работу многопоточного приложения. Уверен, полученные знания можно будет приме?/p>