Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. // APPS_vlakna.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <windows.h>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. const int delka = 1000;
  14. const int rozmer = 2000;
  15.  
  16. int *pole;
  17. int *setridene_pole;
  18. int *prvni_polovina_pole;
  19. int *druha_polovina_pole;
  20.  
  21. void setArray(int pole[], int size){
  22. for(int i =0; i<size;i++){
  23. pole[i] = rand()%rozmer+1;
  24. }
  25. }
  26.  
  27. void printArray(int pole[], int size){
  28. for(int i =0; i<size;i++){
  29. cout<<pole[i]<< " ";
  30. }
  31. cout<<endl;
  32.  
  33. }
  34.  
  35. void bubbleSort(int list[], int size)
  36. {
  37. int help;
  38.  
  39. for(int i=0;i<size;i++)
  40. {
  41. for(int j=0;j<size;j++)
  42. {
  43. if(list[j+1] < list[j])
  44. {
  45. help = list[j+1];
  46. list[j+1] = list[j];
  47. list[j]=help;
  48. }
  49. }
  50. }
  51. }
  52.  
  53. void splitArray(int pole[], int pole1[], int pole2[], int size){
  54. for(int i =0; i<size;i++){
  55.  
  56. if(i < size/2){
  57. pole1[i] = pole[i];
  58. }
  59.  
  60. else{
  61. pole2[i] = pole[i];
  62. }
  63. }
  64. }
  65.  
  66. void linkArray(int pole[], int pole1[], int pole2[], int size){
  67. int druha_polovina = size - size/2;
  68. int j = 0;
  69. int k = 0;
  70.  
  71. for(int i =0; i<size;i++){
  72. if((pole1[j] < pole[k] && j<size/2) || k == druha_polovina){
  73. if(j < size/2){
  74. pole[i] = pole1[j];
  75. }
  76. j++;
  77. }
  78. else{
  79. if( j < druha_polovina ){
  80. pole[i] = pole2[k];
  81. }
  82. k++;
  83. }
  84. }
  85. }
  86.  
  87. DWORD WINAPI vlakno_A(LPVOID){
  88. cout<<"Startuje vlakno A"<<endl;
  89. bubbleSort(prvni_polovina_pole,delka/2);
  90. return 0;
  91. }
  92.  
  93. DWORD WINAPI vlakno_B(LPVOID){
  94. cout<<"Startuje vlakno B"<<endl;
  95. bubbleSort(druha_polovina_pole,delka-delka/2);
  96. return 0;
  97. }
  98.  
  99. int getTime(LPFILETIME start, LPFILETIME end)
  100. {
  101. hyper start64b = start->dwHighDateTime;
  102. start64b = (start64b << 32) | start->dwLowDateTime;
  103. hyper end64b = end->dwHighDateTime;
  104. end64b = (end64b << 32) | end->dwLowDateTime;
  105. // konverze 100ns -> 1ms
  106. return ( int ) ((end64b - start64b)/10000);
  107. }
  108.  
  109. int main(){
  110.  
  111. srand((int)time(NULL));
  112.  
  113. pole = new int[delka];
  114. setridene_pole = new int[delka];
  115. prvni_polovina_pole = new int [delka/2];
  116. druha_polovina_pole = new int [delka-delka/2];
  117.  
  118. FILETIME time_start;
  119. FILETIME time_end;
  120.  
  121. //1b napln pole hodnotama nahodnyma
  122. /*
  123. setArray(pole,delka);
  124. printArray(pole,delka);
  125. */
  126.  
  127. //2b - setridit pole
  128. /*
  129. setArray(pole,delka);
  130. setridene_pole = pole;
  131. bubbleSort(setridene_pole, delka);
  132. printArray(setridene_pole,delka);
  133. */
  134. //3b - zjisteni casu pro setrizene pole
  135. /*
  136. setArray(pole,delka);
  137. setridene_pole = pole;
  138. GetSystemTimeAsFileTime(&time_start);
  139. bubbleSort(setridene_pole,delka);
  140. GetSystemTimeAsFileTime(&time_end);
  141.  
  142. printArray(setridene_pole,delka);
  143. cout<<"delka trizeni v [ms] : "<<getTime(&time_start,&time_end)<<endl;
  144. */
  145.  
  146. //4b - rozdelit pole a zmerit cas
  147. /*
  148. setArray(pole,delka);
  149. splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
  150.  
  151. GetSystemTimeAsFileTime(&time_start);
  152.  
  153. bubbleSort(prvni_polovina_pole,delka/2);
  154. bubbleSort(druha_polovina_pole,delka-delka/2);
  155.  
  156. GetSystemTimeAsFileTime(&time_end);
  157.  
  158.  
  159. printArray(prvni_polovina_pole,delka/2);
  160. cout<<endl;
  161.  
  162. printArray(druha_polovina_pole,delka-delka/2);
  163. cout<<endl;
  164.  
  165. cout<<"Celkovy cas trizeni v [ms] : "<<getTime(&time_start, &time_end);
  166. */
  167.  
  168. //7b - oba algoritmy proveď v samostatnych vlaknech
  169. /*
  170. setArray(pole,delka);
  171. splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
  172. HANDLE th1;
  173. HANDLE th2;
  174. GetSystemTimeAsFileTime(&time_start);
  175. th1 = CreateThread(0,0,vlakno_A,0,0,0);
  176. th2 = CreateThread(0,0,vlakno_B,0,0,0);
  177.  
  178. WaitForSingleObject(vlakno_A,INFINITE);
  179. WaitForSingleObject(vlakno_B,INFINITE);
  180.  
  181. GetSystemTimeAsFileTime(&time_end);
  182.  
  183. cout<<"Celkovy cas s trideni s vlakny v [ms] je: "<<getTime(&time_start,&time_end);
  184. */
  185.  
  186. //8b - spojit obe pole dohromady
  187. setArray(pole,delka);
  188. splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
  189.  
  190. HANDLE th1;
  191. HANDLE th2;
  192.  
  193. GetSystemTimeAsFileTime(&time_start);
  194.  
  195. th1 = CreateThread(0,0,vlakno_A,0,0,0);
  196. th2 = CreateThread(0,0,vlakno_B,0,0,0);
  197.  
  198. WaitForSingleObject(vlakno_A,INFINITE);
  199. WaitForSingleObject(vlakno_B,INFINITE);
  200.  
  201. linkArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
  202.  
  203. GetSystemTimeAsFileTime(&time_end);
  204.  
  205. cout<<"Celkovy cas s trideni s vlakny a spojenim pole v [ms] je: "<<getTime(&time_start,&time_end);
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212. return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement