Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // APPS_vlakna.cpp : Defines the entry point for the console application.
- //
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <windows.h>
- using namespace std;
- const int delka = 1000;
- const int rozmer = 2000;
- int *pole;
- int *setridene_pole;
- int *prvni_polovina_pole;
- int *druha_polovina_pole;
- void setArray(int pole[], int size){
- for(int i =0; i<size;i++){
- pole[i] = rand()%rozmer+1;
- }
- }
- void printArray(int pole[], int size){
- for(int i =0; i<size;i++){
- cout<<pole[i]<< " ";
- }
- cout<<endl;
- }
- void bubbleSort(int list[], int size)
- {
- int help;
- for(int i=0;i<size;i++)
- {
- for(int j=0;j<size;j++)
- {
- if(list[j+1] < list[j])
- {
- help = list[j+1];
- list[j+1] = list[j];
- list[j]=help;
- }
- }
- }
- }
- void splitArray(int pole[], int pole1[], int pole2[], int size){
- for(int i =0; i<size;i++){
- if(i < size/2){
- pole1[i] = pole[i];
- }
- else{
- pole2[i] = pole[i];
- }
- }
- }
- void linkArray(int pole[], int pole1[], int pole2[], int size){
- int druha_polovina = size - size/2;
- int j = 0;
- int k = 0;
- for(int i =0; i<size;i++){
- if((pole1[j] < pole[k] && j<size/2) || k == druha_polovina){
- if(j < size/2){
- pole[i] = pole1[j];
- }
- j++;
- }
- else{
- if( j < druha_polovina ){
- pole[i] = pole2[k];
- }
- k++;
- }
- }
- }
- DWORD WINAPI vlakno_A(LPVOID){
- cout<<"Startuje vlakno A"<<endl;
- bubbleSort(prvni_polovina_pole,delka/2);
- return 0;
- }
- DWORD WINAPI vlakno_B(LPVOID){
- cout<<"Startuje vlakno B"<<endl;
- bubbleSort(druha_polovina_pole,delka-delka/2);
- return 0;
- }
- int getTime(LPFILETIME start, LPFILETIME end)
- {
- hyper start64b = start->dwHighDateTime;
- start64b = (start64b << 32) | start->dwLowDateTime;
- hyper end64b = end->dwHighDateTime;
- end64b = (end64b << 32) | end->dwLowDateTime;
- // konverze 100ns -> 1ms
- return ( int ) ((end64b - start64b)/10000);
- }
- int main(){
- srand((int)time(NULL));
- pole = new int[delka];
- setridene_pole = new int[delka];
- prvni_polovina_pole = new int [delka/2];
- druha_polovina_pole = new int [delka-delka/2];
- FILETIME time_start;
- FILETIME time_end;
- //1b napln pole hodnotama nahodnyma
- /*
- setArray(pole,delka);
- printArray(pole,delka);
- */
- //2b - setridit pole
- /*
- setArray(pole,delka);
- setridene_pole = pole;
- bubbleSort(setridene_pole, delka);
- printArray(setridene_pole,delka);
- */
- //3b - zjisteni casu pro setrizene pole
- /*
- setArray(pole,delka);
- setridene_pole = pole;
- GetSystemTimeAsFileTime(&time_start);
- bubbleSort(setridene_pole,delka);
- GetSystemTimeAsFileTime(&time_end);
- printArray(setridene_pole,delka);
- cout<<"delka trizeni v [ms] : "<<getTime(&time_start,&time_end)<<endl;
- */
- //4b - rozdelit pole a zmerit cas
- /*
- setArray(pole,delka);
- splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
- GetSystemTimeAsFileTime(&time_start);
- bubbleSort(prvni_polovina_pole,delka/2);
- bubbleSort(druha_polovina_pole,delka-delka/2);
- GetSystemTimeAsFileTime(&time_end);
- printArray(prvni_polovina_pole,delka/2);
- cout<<endl;
- printArray(druha_polovina_pole,delka-delka/2);
- cout<<endl;
- cout<<"Celkovy cas trizeni v [ms] : "<<getTime(&time_start, &time_end);
- */
- //7b - oba algoritmy proveď v samostatnych vlaknech
- /*
- setArray(pole,delka);
- splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
- HANDLE th1;
- HANDLE th2;
- GetSystemTimeAsFileTime(&time_start);
- th1 = CreateThread(0,0,vlakno_A,0,0,0);
- th2 = CreateThread(0,0,vlakno_B,0,0,0);
- WaitForSingleObject(vlakno_A,INFINITE);
- WaitForSingleObject(vlakno_B,INFINITE);
- GetSystemTimeAsFileTime(&time_end);
- cout<<"Celkovy cas s trideni s vlakny v [ms] je: "<<getTime(&time_start,&time_end);
- */
- //8b - spojit obe pole dohromady
- setArray(pole,delka);
- splitArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
- HANDLE th1;
- HANDLE th2;
- GetSystemTimeAsFileTime(&time_start);
- th1 = CreateThread(0,0,vlakno_A,0,0,0);
- th2 = CreateThread(0,0,vlakno_B,0,0,0);
- WaitForSingleObject(vlakno_A,INFINITE);
- WaitForSingleObject(vlakno_B,INFINITE);
- linkArray(pole,prvni_polovina_pole,druha_polovina_pole,delka);
- GetSystemTimeAsFileTime(&time_end);
- cout<<"Celkovy cas s trideni s vlakny a spojenim pole v [ms] je: "<<getTime(&time_start,&time_end);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement