С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
13 / 13 / 5
Регистрация: 02.08.2012
Сообщений: 162
1

Многопоточность при работе с файлами

10.06.2013, 01:56. Показов 1677. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи!
Написал код для сравнения двух файлов:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            string text, text2;
            bool write = true;
            a = new StreamReader(filePathA);
            b = new StreamReader(filePathB);
            c = new StreamWriter("result.txt");
            while (!a.EndOfStream)
            {
                text = a.ReadLine();
                while (!b.EndOfStream)
                {
                    text2 = b.ReadLine();
                    if (text == text2)
                        write = false;
                }
                b.BaseStream.Position = 0;
                if (write)
                    c.WriteLine(text);
                else
                    write = true;
            }
Как переделать его под многопоточность?
А то даже, если файлы имеют по 10 - 20 к строк программа зависает
Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2013, 01:56
Ответы с готовыми решениями:

Утечка памяти при работе с файлами TIFF
Здравствуйте! Помогите найти утечку памяти, читал msdn, но так и не понял как это сделать вот и...

Ошибка при работе с файлами
Вечер добрый! Есть код: string test; StreamReader rr =...

Создать приложение, которое использует многопоточность при своей работе с RichTextBox
Создать приложение, которое использует многопоточность при своей работе: обновляет содержимое...

Ошибка при работе с файлами
Столкнулся с такой проблемой, что если выбран FileMode.OpenOrCreate, то значения в массив выводятся...

9
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
10.06.2013, 05:59 2
Как-нибудь так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 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;
                }
        }
    }
1
13 / 13 / 5
Регистрация: 02.08.2012
Сообщений: 162
10.06.2013, 09:27  [ТС] 3
Цитата Сообщение от MrCold Посмотреть сообщение
Как-нибудь так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 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;
                }
        }
    }
А как можно добавить несколько потоков?
Софт теперь не завсисает при файлах на 20 - 30 к, но работает очень медленно
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
10.06.2013, 09:39 4
Потоки здесь уже ничем ни помогут . При файлах такого объема скорость работы будет небольшой .
1
13 / 13 / 5
Регистрация: 02.08.2012
Сообщений: 162
10.06.2013, 15:41  [ТС] 5
Цитата Сообщение от MrCold Посмотреть сообщение
Потоки здесь уже ничем ни помогут . При файлах такого объема скорость работы будет небольшой .
Тоесть скорость работы нельзя никак увеличить?

И как управлять компонентами в потоках?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
       void FileCompare()
        {
            string text, text2;
            bool write = true;
            using (StreamReader first = new StreamReader(filePathA),
                               second = new StreamReader(filePathB))
            using (StreamWriter result = new StreamWriter(filePathResult))
                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;
                    progressBar1.Increment(1);
                }
            stopcompare = true;
        }
Так не хочет работать, выдает ошибку

Добавлено через 2 часа 3 минуты
134
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
10.06.2013, 16:15 6
Цитата Сообщение от fanat2011 Посмотреть сообщение
И как управлять компонентами в потоках?

Не по теме:

Писал на коленке, компутер поломался .Проверять не получается


Передал ProgressBar через ParameterizedThreadStart
Мне кажется без него будет форма подвисать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        void FileCompare(Object Info)
        {
            ProgressBar progressBar = (ProgressBar)Info;
            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;
 
                    if(progressBar.InvokeRequired)
                        Invoke(new Action(() => progressBar.Increment(1)));
                    else
                        progressBar.Increment(1);
            }
            stopcompare = true; 
        }
 
        //  КНОПКА СРАВНИТЬ 
        private void button1_Click(object sender, EventArgs e)
        {
            stopcompare = false;
            if (thread == null)
            {
                thread = new Thread(new ParameterizedThreadStart(FileCompare));
                thread.Start(progressBar1);
            }
        }
 
        //  КНОПКА ПРЕРВАТЬ
        private void button2_Click(object sender, EventArgs e)
        {           
                stopcompare = true;
                if (thread != null)
                {
                    thread.Abort();
                    thread = null;
                }
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            stopcompare = true;
            if (thread != null)
            {
                thread.Abort();
                thread = null;
            }
        }
    }
1
13 / 13 / 5
Регистрация: 02.08.2012
Сообщений: 162
11.06.2013, 08:24  [ТС] 7
А как обратится к еще одному компоненту в потоке, например, label?
0
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 974
11.06.2013, 10:19 8
1 Создаем два потока.
2 В первом потоке вычисляем MD5 первого файла.
3 Во втором потоке вычисляем MD5 второго файла.
4 Сравниваем MD5 двух файлов.
1
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.06.2013, 21:12 9
Мне кажется проще поблочно считывать (были дебаты на эту тему тут уже).
Многопоточность тут будет только вредить, потому что у диска только линейное чтение быстрое, если только не ssd. А значит смена контекста будет только тормозить.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.06.2013, 21:14 10
Цитата Сообщение от MrCold Посмотреть сообщение
Как-нибудь так
BackgroundWorker
0
11.06.2013, 21:14
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2013, 21:14
Помогаю со студенческими работами здесь

Ошибка при работе с файлами
Всем привет! Кто подскажет, почему не работает этот код: FILE *file; int i = 0; if((file =...

Ошибка при работе с файлами
Sub â_ïðîåêòèðîâàíèå() If Dir(ActiveWorkbook.Path & "\Google Äèñê\Projects\" &...

Проблемы при работе с файлами
доброго времени! возник у меня маленький трабл при работе с файлами. Причем совершенно не могу...

Ошибка при работе с файлами
не могу разобраться procedure TForm1.BitBtn1Click(Sender: TObject); var...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru