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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2013, 13:44   #1
fanat2011
 
Регистрация: 18.03.2013
Сообщений: 5
По умолчанию Многопоточность при работе с файлами

Всем привет!

Написал такой код для работы с файлами через потоки
Как можно ускорить выполнения, а то файл который имеет 20к строк вечность обрабатывать будет
Код:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Thread thread;
        const string firstpath = "first.txt",
                     secondpath = "second.txt",
                     resultpath = "result.txt";
       
        bool stopcompare = true;
 
        void FileCompare()
        {
            string text, text2;
            bool write = true;
            using (StreamReader first = new StreamReader(firstpath),
                               second = new StreamReader(secondpath))
            using (StreamWriter result = new StreamWriter(resultpath))
                while (!first.EndOfStream && ! stopcompare)
            {
                text = first.ReadLine();
                while (!second.EndOfStream)
                {
                    text2 = second.ReadLine();
                    if (text == text2)
                        write = false;
                }
                second.BaseStream.Position = 0;
                if (write)
                    result.WriteLine(text);
                else
                    write = true;
            }
            stopcompare = true; 
        }
 
        //  КНОПКА СРАВНИТЬ 
        private void button1_Click(object sender, EventArgs e)
        {
            stopcompare = false;
            if (thread == null)
            {
                thread = new Thread(FileCompare);
                thread.Start();
            }
        }
 
        //  КНОПКА ПРЕРВАТЬ
        private void button2_Click(object sender, EventArgs e)
        {           
                stopcompare = true;
                if (thread != null)
                {
                    thread.Abort();
                    thread = null;
                }
        }
    }
И как управлять компонентами которые есть в функции которая вызывается потоком? Пример progressBar1.Increment(1); не хочет работать

Заранее спасибо, жду ответа
fanat2011 вне форума Ответить с цитированием
Старый 11.06.2013, 09:46   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Загрузите сразу оба текстовых файла в память:
Код:
var text1 = File.ReadAllLines(firstpath);
var text2 = File.ReadAllLines(secondpath);
А то вы второй файл аж по несколько раз читаете с диска, а это в сотни раз медленнее, чем из оперативы.
Это был клавный косяк, но ещё можно и результат тоже собирать в STringBuilder'е, а потом одной строчкой записать в файл
Код:
var sb = new StringBuilder();
...
File.WriteAllText(resultpath, sb.ToString());
После этого все проблемы скорости должны отпасть.

Что касается работы с контролами из другого потока - этого делать напрямую нельзя. Необходимо сделать отдельный метод, и вызывать его через Invoke - тогда он вызовется в том потоке, в котором создан контрол.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 11.06.2013 в 09:57. Причина: опечатка
Selestis вне форума Ответить с цитированием
Старый 11.06.2013, 09:56   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

а если файлы по 300 метров будут? Памяти не хватит
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 11.06.2013, 10:03   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

WorldMaster, судя по тому, что это типичная универская задачка на потоки, таких файлов не будет ;-)
Пусть автор посмотрит, если не подойдёт - надо будет дальше размышлять.
Но даже если так, то всё равно нужно грузить по крайней мере блоками.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Флаги при работе с бинарными файлами Стремящийся Общие вопросы C/C++ 0 02.08.2012 16:17
Проблема при работе с файлами stck Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2011 11:28
Многопоточность при работе со списком NieL Общие вопросы Delphi 13 21.03.2011 15:13
ошибка 105 (при работе с типизированными файлами) sdp Общие вопросы Delphi 8 11.07.2007 11:12