Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 22:22   #1
alex(21)
Форумчанин
 
Аватар для alex(21)
 
Регистрация: 09.06.2009
Сообщений: 545
Сообщение определить время сортировки

Здравствуйте. у меня не получается вывести время сортировки в textBox. есть 2 backgroundWorker и 2 textBox, в каждом из них свой метод сортировки. при нажатии на кнопку начать начинается сортировка массива и по завершении в textBox надо вывести время сортировки. для определения времени я создал две глобальные переменные и увеличивал их в таймере. но время определяет не правильно. как можно доработать?
вобщем вот что у меня получилось:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace sortirovka_potoki
{
    public partial class Form1 : Form
    {
        int time1 = 0, time2 = 0;
        DateTime time = DateTime.Now, vr1;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Random el_mas = new Random();
            int a = 40000, max_el_mas = 50;
            int[] mas = new int[a];
            int k = 0;
            for (int m = 0; m < a; m++)
                mas[m] = el_mas.Next(max_el_mas);
            int i = 0;
            for (int j = 2; j < a; j++)
            {
                i = j - 1;
                k = mas[j];
            m1: if (k >= mas[i])
                {
                    mas[i + 1] = k;
                }
                else
                {
                    mas[i + 1] = mas[i];
                    i = i - 1;
                    if (i > 0)
                        goto m1;
                    mas[i + 1] = k;
                }
            }
            MessageBox.Show("Сортировка методом вставки завершена!");
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            timer2.Enabled = true;
            Random el_mas = new Random();
            int a = 10000, max_el_mas = 50, b=a;
            int[] mas = new int[a];
            for (int i = 0; i < a; i++)
            {
                mas[i] = el_mas.Next(max_el_mas);
            }
            int s = b, k;
            for (int i = 0; i < b - 1; i++)
            {
                for (int j = 0; j < s-1; j++)
                {
                    if (mas[j] < mas[j + 1])
                    {
                        k = mas[j];
                        mas[j] = mas[j + 1];
                        mas[j + 1] = k;
                    }
                }
                s--;
            }
            MessageBox.Show("Сортировка методом обмена завершена!");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
            backgroundWorker2.RunWorkerAsync();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            time1++;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            time2++;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!(e.Cancelled))
            {
                textBox1.Text = time1.ToString();
                timer1.Enabled = false;
            }
        }

        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!(e.Cancelled))
            {
                textBox2.Text = time2.ToString();
                timer2.Enabled = false;
            }
        }
    }
}
alex(21) вне форума Ответить с цитированием
Старый 28.03.2013, 22:47   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Да когда-ж вы научитесь поиском пользоваться ТЫК.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 29.03.2013, 10:43   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

А использовать класс Stopwatch ни пробовал? Код с MSDN:
Код:
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 29.03.2013, 16:19   #4
stalsoft
Форумчанин
 
Регистрация: 09.06.2011
Сообщений: 147
По умолчанию

Не мое, но источнику я доверяю.

4. Класс Stopwatch (секундомер)

Сколько раз вы хотели засечь, сколько времени выполняется кусок кода? Может быть, вы пытались отследить среднее время выполнения запроса или другую подобную информацию, или, возможно, пытались отправить предупреждающее сообщение, когда метод требует более одной секунды для выполнения?
Вы могли бы сделать это, используя DateTime:
DateTime start = DateTime.Now; SomeCodeToTime();
DateTime end = DateTime.Now;
Console.WriteLine("Выполнение метода заняло {0} мс", (end-start).TotalMilliseconds);

Но DateTime неточен для такого рода вычислений. Вы можете обратиться к таймеру более высокой точности через Win32 API, но этот способ более «грязный» и подвержен ошибкам.
Так что же делать разработчику? Использовать класс Stopwatch, который расположен в пространстве имен System.Diagnostics. Класс Stopwatch упрощает использование высокоточного таймера:
var timer = Stopwatch.StartNew();
SomeCodeToTime();
timer.Stop();
Console.WriteLine("Выполнение метода заняло {0} мс", timer.ElapsedMilliseconds);

Гораздо более точно. Обратите внимание, что есть статический метод, который создает и запускает секундомер. Также есть возможность создать секундомер с использование new и запустить, когда понадобится.
У женщин чары образуются из стрингов;
А у программистов наоборот - стринги образуются из чаров;
stalsoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить, какому алгоритму сортировки отдать предпочтение при решении задачи? Proskurina Общие вопросы по программированию, компьютерный форум 2 16.11.2012 15:37
Сложность и время работы сортировки Шелла lega4 Помощь студентам 0 11.04.2011 11:02
во время сортировки программа вылетает MaRKer.nsk Общие вопросы C/C++ 3 10.04.2010 15:49
Время сортировки в Delphi 7 Александр М Помощь студентам 3 19.11.2008 22:50
измерить время сортировки Cyberbest Помощь студентам 1 01.05.2008 19:30