Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Int lstrlen(LPCTSTR lpString)

Поиск

 

lpString – указатель на строку

 

 

Приложение П3

 

//Директивой препроцессора подключаются

//заголовочные файлы

#include <windows.h>

#include <math.h>

#include "main.h"

#include "resource.h"

//Объявление глобальных переменных

DWORD input_var[13]; // Массив входных переменных

HANDLE event_obj[6]; // Массив хендлов объектов //синхронизации

HANDLE hThread[4]; // Массив хендлов тредов

//Массив указателей на функции тредов

LPTHREAD_START_ROUTINE pThread[4] = { (LPTHREAD_START_ROUTINE)Thread1,

(LPTHREAD_START_ROUTINE)Thread2,

(LPTHREAD_START_ROUTINE)Thread3,

(LPTHREAD_START_ROUTINE)Thread4

};

//Хендл диалогового окна

HWND hMainDlg;

//Функция - первый тред

void Thread1() {

char buf[20];

//Функцией addstr в ListBox выводится текст (см.

//main.h)

addstr(#1: Starting thread...);

addstr(#1: a = a + b...);

//Ассемблерная вставка, для подсчета суммы a

//b

__asm {

mov eax, input_var[B]

add input_var[A], eax

}

addstr(#1: Set event S12...);

//Функция установки объекта события

SetEvent(event_obj[S12]);

addstr(#1: m = sqrt(m)...);

input_var[M] = (DWORD)sqrt((double)input_var[M]);

addstr(#1: l = l - m...);

input_var[L] -= input_var[M];

Продолжение прил. П3

 

addstr(#1: Set event S13...);

SetEvent(event_obj[S13]);

addstr(#1: Sleep: (Waiting for S31 and S41)...);

//Функция ожидания нескольких объектов события

WaitForMultipleObjects(2, &event_obj[S31], true, INFINITE);

addstr(#1: Restore: (S31 and S41 are setting up)...);

//При делении на 0 выводится сообщение

//об ошибке (функция MessageBox)

if(!input_var[K]) {

MessageBox(hMainDlg, "Divide by NULL error!\nReenter some variables!", "Error", MB_ICONERROR);

goto _ex;

}

 

addstr(#1: A = a / k...);

// Вычисление результата с записью в переменную

//input_var[A]

input_var[A] /= input_var[K];

wsprintf(buf, "Result A = %li", input_var[A]);

//Вывод результата на экран (функция MessageBox)

MessageBox(hMainDlg, buf, "Result", 0);

addstr(#1: Exit thread...);

_ex:

EnableWindow(GetDlgItem(hMainDlg, IDC_START), true);

EnableWindow(GetDlgItem(hMainDlg, IDC_TERMINATE),

false);

}

 

void Thread2() { //Функция - второй тред

 

addstr(#2: Starting thread...);

addstr(#2: c = c + d...);

input_var[C] += input_var[D];

addstr(#2: Sleep: (Waiting for S12)...);

//Функция ожидания одного объекта события

WaitForSingleObject(event_obj[S12], INFINITE);

Продолжение прил. П3

 

addstr(#2: Restore: (S12 is setting up)...);

addstr(#2: a = a * c...);

input_var[A] *= input_var[C];

addstr(#2: Sleep: (Waiting for S32)...);

WaitForSingleObject(event_obj[S32], INFINITE);

addstr(#2: Restore: (S32 is setting up)...);

addstr(#2: a = a * e...);

input_var[A] *= input_var[E];

addstr(#2: Set event S24...);

SetEvent(event_obj[S24]);

addstr(#2: Exit thread...);

}

 

void Thread3() { //Функция - третий тред

 

addstr(#3: Starting thread...);

addstr(#3: e = e + f...);

input_var[E] += input_var[F];

addstr(#3: e = e + g...);

input_var[E] += input_var[G];

addstr(#3: Set event S32...);

SetEvent(event_obj[S32]);

addstr(#3: Sleep: (Waiting for S13)...);

WaitForSingleObject(event_obj[S13], INFINITE);

addstr(#3: Restore: (S13 is setting up)...);

addstr(#3: k = k * l...);

input_var[K] *= input_var[L];

addstr(#3: Set event S31...);

SetEvent(event_obj[S31]);

addstr(#3: Exit thread...);

 

}

 

void Thread4() { //Функция - четвертый тред

 

addstr(#4: Starting thread...);

addstr(#4: h = h * i...);

input_var[H] *= input_var[I];

addstr(#4: h = h * j...);

input_var[H] *= input_var[J];

addstr(#4: Sleep: (Waiting for S24)...);

WaitForSingleObject(event_obj[S24], INFINITE);

addstr(#4: Restore: (S24 is setting up)...);

Продолжение прил. П3

 

addstr(#4: a = a - h...);

input_var[A] -= input_var[H];

addstr(#4: Set event S41...);

SetEvent(event_obj[S41]);

addstr(#4: Exit thread...);

}

//Функция получения входных переменных

bool GetOurVariables(HWND hDlg) {

char varbuffer[10];

for(int a = IDC_EDIT1; a <= IDC_EDIT13; a++) {

input_var[a - IDC_EDIT1] = 0;

if(!GetDlgItemText(hDlg, a, varbuffer, 10))

return false;

DWORD mul = 1;

for(int b = lstrlen(varbuffer) - 1;

b >= 0; b--, mul *= 10)

input_var[a - IDC_EDIT1] +=

(varbuffer[b] - 0x30) * mul;

}

return true;

}

//Процедура обработки диалогового окна

LRESULT CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {

 

DWORD ThreadID; //ThreadID - уникальный номер

//треда

//Обработка сообщений

switch (uMsg) {

case WM_COMMAND: {

switch (LOWORD(wParam)) {

//Обработка сообщения по нажатии

//кнопки START

case IDC_START: {

//Проверка введенных значений

if(!GetOurVariables(hDlg)) {

//Если данные не

//введены,

//то выводится

//сообщение (функция

//MessageBox)

Продолжение прил. П3

 

MessageBox(hDlg, "Enter all variables and run again!", "Attention", MB_ICONINFORMATION);

return false;

}

//Функция отправки сообщения

//в ListBox (в данном случае

//очистка ListBox)

SendDlgItemMessage(hDlg, IDC_LISTING, LB_RESETCONTENT, 0, 0);

//Цикл по созданию тредов

for(int a = THREAD1;

a <= THREAD4; a++) {

//Заполнение массива

//hThread хендлами

//тредов

hThread[a] =

CreateThread(NULL,

NULL, pThread[a], NULL,

NULL, &ThreadID);

//Установка приоритетов

//тредов

SetThreadPriority(hThread[a],

THREAD_PRIORITY_TIME_CRITICAL);

}

//Функции "активации

//деактивации"

//кнопок START и TERMINATE

EnableWindow(GetDlgItem(hDlg,

IDC_START), false);

EnableWindow(GetDlgItem(hDlg,

IDC_TERMINATE), true);

}

break;

//Обработка сообщения по нажатии

//кнопки TERMINATE

case IDC_TERMINATE: {

Продолжение прил. П3

 

//Цикл по принудительному

//завершению

//всех тредов (функция

//TerminateThread)

for(int a = THREAD1; a <=

THREAD4; a++) {

TerminateThread(hThread[a],

false);

}

//Функции "активации

//деактивации"

//кнопок START и TERMINATE

EnableWindow(GetDlgItem(hDlg,

IDC_TERMINATE), false);

EnableWindow(GetDlgItem(hDlg,

IDC_START), true);

}

}

}

break;

//Обработка сообщения при создании диалогового

//приложения

case WM_INITDIALOG: {

hMainDlg = hDlg;

//Функция отправки сообщения

SendMessage(hDlg, WM_SETICON, ICON_BIG,

(LPARAM)LoadIcon(0, IDI_EXCLAMATION));

}

break;

//Обработка сообщения по нажатии кнопки CLOSE

case WM_CLOSE:

//Функция завершения диалогового

//приложения

EndDialog(hDlg, 0);

}

return false;

}

//Точка входа в программу

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

//Цикл по созданию объектов события функцией

//CreateEvent

for(int a = S12; a <= S41; a++)

Окончание прил. П3

 

event_obj[a] = CreateEvent(NULL, false, false,

NULL);

//Функция создания диалогового окна

DialogBoxParam(hInstance,

MAKEINTRESOURCE(IDD_MAINDLG), 0, (DLGPROC)DlgProc,

0);

return false;

}


Приложение П4

#ifndef MAIN_H

#define MAIN_H

#define A 0

#define B 1

#define C 2

#define D 3

#define E 4

#define F 5

#define G 6

#define H 7

#define I 8

#define J 9

#define K 10

#define L 11

#define M 12

#define S12 0

#define S13 1

#define S32 2

#define S24 3

#define S31 4

#define S41 5

#define THREAD1 0

#define THREAD2 1

#define THREAD3 2

#define THREAD4 3

//Организация макроподстановки для вывода состояний тредов

//в ListBox

//с помощью функции SendDlgItemMessage

#define addstr(str) SendDlgItemMessage(hMainDlg,

IDC_LISTING, LB_ADDSTRING, 0,

(LPARAM)#str); \

SendDlgItemMessage(hMainDlg,

IDC_LISTING, LB_SETTOPINDEX, \

SendDlgItemMessage(hMainDlg,

IDC_LISTING, LB_GETCOUNT, 0, 0) –

1, 0)

void Thread1();

void Thread2();

void Thread3();

void Thread4();

#endif

Приложение П5

.model small

.stack 20h; 6 bytes needed

.data

 

A equ 24

B equ 22

C equ 20

D equ 18

E equ 16

F equ 14

G equ 12

H equ 10

I equ 8

J equ 6

K equ 4

L equ 2

M equ 0

 

in_string db 'Введите число A = $'

in_array dw 13 dup (0)

otvet db 13,10,'Ответ равен $'

press_enter db 13,10,13,10,'Нажмите <Enter> для

завершения...$'

 

.code

entrypoint:

mov ax,@data

mov ds,ax

mov cx,13

@1: xor si,si

mov dx,offset in_string

mov ah,9

int 21h

@3: mov ah,8

int 21h

cmp al,0Dh

je @2

cmp al,'0'

jb @3

cmp al,'9'

ja @3

mov ah,2

mov dl,al

int 21h

Продолжение прил. П5

 

and dx,0FFh

sub dx,'0'

push dx

test si,si

je @4

pop ax

pop dx

add ax,dx

pop dx

jmp @end

@4: mov ax,0Ah

mul dx

push ax

inc si

jmp @3

@2: test si,si

je @3

pop ax

pop ax

@end: mov si,cx

dec si

shl si,1

mov in_array[si],ax

mov dl,0Dh

mov ah,02h

int 21h

mov dl,0Ah

mov ah,02h

int 21h

inc byte ptr [offset in_string + 14]

loop @1

 

mov ax,in_array[B]

add in_array[A],ax

 

mov ax,in_array[D]

add in_array[C],ax

 

mov ax,in_array[A]

mul in_array[C]

 

mov cx,in_array[E]

add cx,in_array[F]

Продолжение прил. П5

 

add cx,in_array[G]

 

mul cx

 

push ax

 

mov ax,in_array[H]

mul in_array[I]

mul in_array[J]

 

pop cx

sub cx,ax

 

push cx

 

fwait

fild word ptr in_array[M]

fsqrt

fist word ptr in_array[M]

 

mov ax,in_array[L]

sub ax,in_array[M]

 

mul in_array[K]

 

mov cx,ax

xor dx,dx

pop ax

 

div cx

 

xor si,si

xor dx,dx

mov cx,10

@loop: xor dx,dx

div cx

 

add dx,'0'

mov byte ptr in_string[si],dl

inc si

test ax,ax

jne @loop

@ok: mov dx,offset otvet

Окончание прил. П5

 

mov ah,9

int 21h

dec si

@out: mov dl,in_string[si]

mov ah,2

int 21h

dec si

jge @out

 

mov dx,offset press_enter

mov ah,9

int 21h

 

@repeat: mov ah,8

int 21h

cmp al,0Dh

jne @repeat

 

 

mov ah,4ch

int 21h

 

end entrypoint

 

 

Приложение П6

 

№ варианта Арифметическое выражение
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Продолжение прил. П6

№ варианта Арифметическое выражение
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Продолжение прил. П6

 

№ варианта Арифметическое выражение
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Продолжение прил. П6

№ варианта Арифметическое выражение
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Окончание прил. П6

№ варианта Арифметическое выражение
 
 
 
 
 
 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Ассемблер и Си: Учеб. пособ. для вузов / Лаврентьев С.М. – М.: Финансы и статистика, 2004.

2. Введение в операционные системы: Учеб. пособ. / Д.В. Иртегов. – СПб.: БВХ-Петербург, 2002. – 624 с.: ил.

3. Гордеев А.В. Операционные системы: Учебник для вузов. Изд. 2-е. – СПб.: Питер, 2004. – 416 с.: ил.

4. Олифер В.Г., Олифер Н.А. Сетевые операционные системы: Учебник для вузов. – СПб.: Питер, 2002. – 544 с.: ил.

5. Павловская Т.А. С/С++: Программирование на языке высокого уровня: Учебник для вузов. – СПб.: Питер, 2003. – 462 с.: ил.

6. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб. пособие для вузов. Изд. 2-е, дополненное. – М.: Финансы и статистика, 2000. – 192с.: ил.

7. Столингс В. Операционные системы: внутреннее устройство и принципы проектирования/ Пер. с англ. Изд. 4-е. – М.: Издат. Дом «Вильямс», 2002. – 848 с.: ил.

8. Юров В.И. Assembler: Учебник для вузов. Изд. 2-е. – СПб.: Питер, 2004. – 637 с.: ил.

 

оглавление

Введение ……………..…………………………………………...3

1. Содержание и объем курсовой работы ……………...…...4

2. Оформление курсовой работы. …...…………………...…..5

3. Распараллеливание обработки информации –



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 453; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.126.241 (0.008 с.)