コード例 #1
0
ファイル: Program.cs プロジェクト: AldenSeries/TDDP_lab
         //Метод, осуществляющий запуск параллельного алгоритма сортировки слиянием.
         //Результат - время подготовки необходимого для запуска асинхронных
         //вычислений и разбиения задачи на подзадачи.
        
        public long workAsync()
        {
            Stopwatch watcher = new Stopwatch(); // вычисление полного времени вычислений
            watcher.Start();                     

            InputData[] ClArr = new InputData[processCount];    // Создал хранилище начальных данных для подзадач
            for (int i = 0; i < processCount; i++)              
                ClArr[i] = new InputData();                     

            int step = (Int32)(itemCount / processCount);       // Размер данных

            int c = -1;
            for (int i = 0; i < processCount; i++)              // Заполнил хранилище исходными данными 
            {                                                   
                ClArr[i].start = c + 1;                         
                ClArr[i].stop = c + step;
                c += step;
            }

            // Создадим диспетчер задач
            Dispatcher d = new Dispatcher(processCount, "Test Pool");
            DispatcherQueue dq = new DispatcherQueue("Test Queue", d);
            // Определим экземпляр порта
            Port<int> port = new Port<int>();
            // Заполняем диспетчер задачами
            for (int i = 0; i < processCount; i++)
            {
                Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], port, sort));
            }

            // Зададим задачу, которая будет выполнена после выполнения всех остальных задач
            Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, port, processCount, delegate (int[] array)
                {
                    // Проведем окончательно слияние 2 отсортированных подмасива
                    MainMerge(raw, 0, (itemCount - 1) / 2 + 1, itemCount - 1);
                    watcher.Stop();
                    // Выведем сообщение об времени выполнения алгоритма
                    Console.WriteLine("Общее время выполнения: " + watcher.ElapsedMilliseconds);
                }
            ));
            return watcher.ElapsedMilliseconds;
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: AldenSeries/TDDP_lab
        public void sort(InputData data, Port<int> resp)
        {
            Stopwatch sWatch = new Stopwatch();
            sWatch.Start();

            // Запустим на выполнение линейный алгоритм
            SortMerge(raw, data.start, data.stop);

            sWatch.Stop();
            // Выведем информацию о том, сколько по времени работал конкретно этот поток
            Console.WriteLine("Поток № {0}: локальное время работы = {1} мс.",
                Thread.CurrentThread.ManagedThreadId,
                sWatch.ElapsedMilliseconds.ToString());
            resp.Post(1);
        }