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

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

10.06.2013, 01:56. Показов 1660. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru