Составление программы для вычисления 100 отсчетов сигнала

Страницы работы

Содержание работы

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

Кафедра Систем Сбора и Обработки Данных

Дисциплина «Операционные системы»

Расчетно-графическая работа

Группа:       АО-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.  “Язык СИ++” В.В. Подбельский

Похожие материалы

Информация о работе