НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
Кафедра Систем Сбора и Обработки Данных
Дисциплина «Операционные системы»
Расчетно-графическая работа
Группа: АО-41
Студент: Осипов С.Д.
Вариант: 6
Преподаватель: Еленычев С. В.
Новосибирск, 2006.
Задание: Составить программу для вычисления 100 отсчетов сигнала вида y(n)=2*sin(2*pi*10*n*Td) + sin (2*pi*15*n*Td), где интервал дискретизации Td = 0.01с. Сохранить сгенерированный сигнал в текстовом файле. В файле сохранить также информацию о сигнале: число гармоник, частота гармоник, частота дискретизации. Генерацию и запись в файл осуществлять в отдельных потоках.
Описание алгоритма работы программы
При запуске программы создается два дополнительных потока [CreateThread()]. Один поток для генерации значений сигнала ,y(n)=2*sin(2*pi*10*n*Td)+sin(2*pi*15*n*Td), а другой, для записи в файл.
Так же создаются два события [CreateEvent()], для синхронизации потоков. События в несигнальном состоянии. Переустанавливаются в сигнальное состояние вызовом функции SetEvent(), а в несигнальное при помощи функции ResetEvent().
Устанавливается событие 0. Поток генерации сигнала, ожидающий прихода этого события [WaitForSingleObject()], производит вычисление , сбрасывает событие и устанавливает событие 1. А его уже ждет поток записи в файл. Этот поток переводит событие в несигнальное состояние , записывает в файл и устанавливает событие 0. и все повторяется пока счетчик в потоке, генерирующем сигнал, не обнулится. Цикл закончен.
Для того, чтобы главный поток программы не завершил все потоки раньше окончания вычислений использован флаг endthr. Когда завершается цикл, флаг устанавливается в 1. Пустой цикл while в теле voidmain() завершится. Программа закроется.
Содержание информации в файле:
Число гармоник = 2
частота 1й гармоники = 10Гц
частота 2й гармоники = 15Гц
частота дискретизации=0.01с
0.000000
1.984587
2.853170
2.211130
0.587785
-1.000000
-1.763356
-1.593096
-0.951057
-0.366553
0.000000
0.366554
0.951056
1.593096
1.763356
1.000000
-0.587785
-2.211130
-2.853170
-1.984588
-0.000000
1.984587
2.853170
2.211130…
Листинг программы:
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <string>
using namespace std;
HANDLE hThread0, hThread1, event0, event1; //объявление дескрипторов потоков и событий.
FILE *stream; //объявление файла
char endthr = 0; //флаг завершения всех операций
double f; //глобальная переменная. Хранит одно значение сигнала.
DWORD WINAPI WriteThread(LPVOID threadno) //поток записи в файл
{
stream = fopen("DUMMY.txt","w");//создание файла с атрибутом, только для чтения
fprintf(stream,"Число гармоник = 2\n частота 1й гармоники = 10Гц\n частота 2й гармоники = 15Гц\n частота дискретизации=0.01с\n");
while (0==0) //цикл записи в файл
{
WaitForSingleObject (event1, INFINITE); ////ожидание события 1
ResetEvent (event1); //сброс события 1
fprintf(stream,"%f\n", f); //запись значения переменной f в файл
SetEvent (event0);//установление события 0
}
fclose(stream); //закрытие файла
return (0);
}
DWORD WINAPI SinThread(LPVOID threadno) //поток, генерирующий сигнал
{
for (int i = 0; i<100; i++) //цикл вычисления сигнала
{
WaitForSingleObject (event0, INFINITE); //ожидание события 0
ResetEvent (event0); //сброс события 0
f = 2 * sin (0.62831853*i) + sin(0.94247779*i); //вычисление сигнала
SetEvent (event1); //установление события 1
}
endthr = 1; //флаг - все потоки завершили вычисления
return (0);
}
void main()
{
DWORD ThreadId0, ThreadId1;
hThread0=CreateThread(NULL,0,WriteThread,0,0,&ThreadId0); //создание потока 0
hThread1 = CreateThread(NULL,0,SinThread,0,0,&ThreadId1);
event0 = CreateEvent (NULL, TRUE, FALSE, "ev0"); //создание события 0 в несигнальном состоянии
event1 = CreateEvent (NULL, TRUE, FALSE, "ev1");
SetEvent (event0); //установка собылтия 0
while (endthr == 0){}; //все потоки завершили вычисления
}
34
Список литературы:
1. Методические указания к лабораторным работам по дисциплине «Операционные системы»
2. “Язык СИ++” В.В. Подбельский
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.