Разработка приложения с несколькими обрабатывающими файл потоками, использующими взаимоисключение на основе критической секции без блокировки частей файла

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

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>