Вопрос 9. Разработать асинхронную программу, реализующую волновую систему для вычисления векторной операции


Добавил:DMT
Дата создания:30 декабря 2007, 18:44
Дата обновления:30 декабря 2007, 18:45
Просмотров:6091 последний 3 апреля, 20:55
Комментариев: 1

Вопрос 9. Разработать асинхронную программу, реализующую волновую систему для вычисления векторной операции .

up

Комментарии для "Вопрос 9. Разработать асинхронную программу, реализующую волновую систему для вычисления векторной операции "


Пользователь: ruslan
Сообщений: 23
Статус: Незримый
Зарегистрирован:
5 января 2008, 2:42
Был:29 января 2008, 21:23
ruslan
smsup
Дата: 14 января 2008, 1:29 Сообщение № 1
Сеть Петри для волновой системы будет иметь следующий вид:


image1


Код на C++
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. //---------------------------------------------------------------------------
  4. #pragma argsused
  5. #include <windows.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <dos.h>
  9. #include <iostream.h>
  10. #include <conio.h>
  11. #include <math.h>
  12. #define n 20
  13. class channel // класс каналов
  14. {
  15. double *buf; // буфер для передачи данных
  16. int size; // размер буфера
  17. HANDLE s,
  18. empty, // семафоры
  19. full;
  20. int countr, countw; // указатели для чтения и записи
  21. public:
  22. channel (int nn): size(nn) // конструктор
  23. {
  24. buf = new double[nn]; // память для буфера
  25. countr=0; countw=0;
  26. s=CreateSemaphore(NULL,1,1,NULL); // создание семафоров
  27. empty=CreateSemaphore(NULL,nn,nn,NULL);
  28. full = CreateSemaphore(NULL,0,nn,NULL);
  29. }
  30. void operator << (double d) // операция записи в канал
  31. {
  32. WaitForSingleObject(empty, INFINITE); // ожидание свободных мест
  33. WaitForSingleObject(s, INFINITE);
  34. buf[countw++]=d; // запись в очередь
  35. if (countw==size) countw=0;
  36. ReleaseSemaphore(s,1,NULL);
  37. ReleaseSemaphore(full,1,NULL); // увеличение числа запи-сей
  38. }
  39. void operator >> (double& d) // операция чтения из канала
  40. {
  41. WaitForSingleObject(full, INFINITE); // ожидание данных
  42. WaitForSingleObject(s, INFINITE);
  43. d = buf[countr]; countr++; // чтение из циклической очереди
  44. if (countr==size) countr = 0;
  45. ReleaseSemaphore(s,1,NULL);
  46. ReleaseSemaphore(empty,1,NULL); // увеличение числа свободных мест
  47. }
  48. };
  49. //---------------------------------------------------------------------------
  50. channel *pc[10];
  51. DWORD WINAPI cosin1(LPVOID)
  52. {
  53. int j;
  54. double d;
  55. for (j=0; j<n; j++)
  56. {
  57. *pc[0]>>d; // прием данных из канала 0
  58. *pc[3]<<cos(d); // умножение и отправление в канал 4
  59. }
  60. return 1;
  61. }
  62. //---------------------------------------------------------------------------
  63. DWORD WINAPI sinus1(LPVOID)
  64. {
  65. int j;
  66. double d;
  67. for (j=0; j<n; j++)
  68. {
  69. *pc[1]>>d; // прием данных из канала 1
  70. *pc[4]<<sin(d); // передача в канал 4
  71. }
  72. return 1;
  73. }
  74. //---------------------------------------------------------------------------
  75. DWORD WINAPI cosin2(LPVOID) // второй поток для вычисления косинуса
  76. {
  77. int j;
  78. double d;
  79. for (j=0; j<n; j++)
  80. {
  81. *pc[2]>>d; // прием из канала 2
  82. *pc[5]<<cos(d); // передача в канал 5
  83. }
  84. return 1;
  85. }
  86. //---------------------------------------------------------------------------
  87. DWORD WINAPI plus1(LPVOID) // первый поток для вычисления суммы
  88. {
  89. int j;
  90. double d1,d2;
  91. for (j=0; j<n; j++)
  92. {
  93. *pc[3]>>d1;*pc[4]>>d2; // прием из каналов 3 и 4
  94. *pc[6]<<(d1+d2); // передача в канал 8
  95. }
  96. return 1;
  97. }
  98. //---------------------------------------------------------------------------
  99. DWORD WINAPI sin2(LPVOID) // второй поток для вычисления синуса
  100. {
  101. int j;
  102. double d;
  103. for (j=0; j<n; j++)
  104. {
  105. *pc[5]>>d; // прием из канала 5
  106. *pc[7]<<sin(d); // передача в канал 7
  107. }
  108. return 1;
  109. }
  110. //---------------------------------------------------------------------------
  111. DWORD WINAPI expo(LPVOID) // поток для вычисления экспоненты
  112. {
  113. int j;
  114. double d;
  115. for (j=0; j<n; j++)
  116. {
  117. *pc[6]>>d; // прием из канала 8
  118. *pc[8]<<exp(d); // передача в канал 10
  119. }
  120. return 1;
  121. }
  122. //---------------------------------------------------------------------------
  123. DWORD WINAPI plus2(LPVOID) // воторой поток для вычисления суммы
  124. {
  125. int j;
  126. double d1,d2;
  127. for (j=0; j<n; j++)
  128. {
  129. *pc[7]>>d1;*pc[8]>>d2; // прием из каналов 7 и 8
  130. *pc[9]<<(d1+d2); // передача в канал 9
  131. }
  132. return 1;
  133. }
  134. //---------------------------------------------------------------------------
  135. void main() // главный поток
  136. {
  137. channel c[10]={10,10,10,10,10,10,10,10,10,10};
  138. // инициализация каналов
  139. int i; // каждый из них состоит из 10 элементов
  140. for (i=0; i<10;i++) pc[i] = &c[i]; // указатели на каналы
  141. CreateThread(NULL,0,cosin1,0,0,0); // запуск потоков
  142. CreateThread(NULL,0,sinus1,0,0,0);
  143. CreateThread(NULL,0,cosin2,0,0,0);
  144. CreateThread(NULL,0,plus1,0,0,0);
  145. CreateThread(NULL,0,sin2,0,0,0);
  146. CreateThread(NULL,0,expo,0,0,0);
  147. CreateThread(NULL,0,plus2,0,0,0);
  148. double u,v,z;
  149. for (i=0; i<n; i++)
  150. {
  151. u=i; v=i+1;
  152. c[0]<<v; // запись в каналы 0,1,2
  153. c[1]<<u; c[2]<<u;
  154. }
  155. for (i=0; i<n; i++)
  156. {
  157. c[9]>>z; cout<<"\n"<<z; // чтение и вывод результатов
  158. cout<<"==";
  159. cout<<(double)(exp(sin(i)+cos(i+1))+sin(cos(i))); // сравнение со значениями
  160. }
  161. getch();
  162. }
  163. //---------------------------------------------------------------------------
  164.  
При использовании обязательна ссылка на http://DMTSoft.ru