С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46

Как организовать корректную работу потоков с одним файлом

08.05.2012, 15:30. Показов 1844. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
private void button1_Click(object sender, EventArgs e)
        {
            for (int p = 0; p < 2; p++)
            {
                Thread t = new Thread(pop);
                t.Start();
            }
        }
 
 
 
 
 private void pop()
        {
            var sync = SynchronizationContext.Current;
 
            
                Dictionary<string, string> accounts = new Dictionary<string, string>();
 
                foreach (string combo in File.ReadAllLines("acc.txt"))
                {
                    
                        string[] values = combo.Split(':');
                        if (values.Length >= 2 && !accounts.ContainsKey(values[0]))
                            accounts.Add(values[0], values[1]);
                    
                }
 
                foreach (KeyValuePair<string, string> kvp in accounts)
                {
 
 
                    string email = kvp.Key;
                    string password = kvp.Value;
 
                    string parsmail;
                    parsmail = Regex.Match(email, @"([^>]*)@").Groups[1].Value;
                    string pardomain;
                    pardomain = Regex.Match(email, @"@([^>]*)").Groups[1].Value;
                
                try
                {

В несколько потоков берутся одни и тежи данные с acc.txt
Нашёл решение lock() но не могу понять как тут его применить

Добавлено через 11 часов 29 минут
никто не подскажет?

Добавлено через 3 часа 31 минуту
Как вообще с тхт в потоке поочереде берутся строки... гугл непомогает (

Добавлено через 1 час 53 минуты
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
 string st;
        private Object lockThis = new Object();
        private void button1_Click(object sender, EventArgs e)
        {
 
            for (int p = 0; p < 2; p++)
            {
                Thread t = new Thread(pop);
                t.Start();
            }
 
 
        }
 
        private void pop()
        {
 
            StreamReader sr = File.OpenText("123.txt");
 
            while (true)
            {
                lock (lockThis)
                {
                    st = sr.ReadLine();
                    if (st == null)
                        break;
                }
                richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += st + "\n"; });
            }
 
        }
Народ есть какие нить мысли по этому вопросу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2012, 15:30
Ответы с готовыми решениями:

Как лучше организовать работу и взаимосвязь почти одинаковых потоков?
При запуске программы появляется окно, в которое вводятся параметры, нажимаем Ok, и теперь у нас на основе этих параметров создаются два...

Как организовать работу с xml-файлом без потери данных?
Всем привет Имеется приложение, которое хранит свои настройки в xml-файле. Имеется отдельная вспомогательная dll'ка в которой имеются...

Организовать работу с файлом
Организовать работу с файлом, содержащим следующие сведения об игрушках: код, наименование, фирма-производитель, возрастное назначение,...

13
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
08.05.2012, 22:35
а в чем ошибка? вроде все правильно написал. Какую ошибку выдает??


можно еще читать построчно в List<>, через Split('/n'), а потом в цыкле "for" лочить только ту часть кода (list[i]), которая читает строку

C#
1
2
3
4
5
6
// код
       lock(thisLock)
         {
            list[i]
         }
       // код


или попробуй еще так. но тоже лочить не плностью все чтение, а только ту часть кода, где берутся значение это и будет ndоя прочитаная строчка и тогда любой поток сможет взять инфу.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
StreamReader reader = new StreamReader("proba.txt");
            object thisLock = new object();
            while ((s = reader.ReadLine()) != null)
            {
                lock(thisLock)
                {
                  string[] split = s.Split(';');
                  int x = Int32.Parse(split[0]);
                  int y = Int32.Parse(split[1]);
                  dataGridView1.CurrentCell = dataGridView1.Rows[x].Cells[y];
                  dataGridView1.CurrentCell.Style.BackColor = Color.Red;
                }
            }
            reader.Close();
1
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46
08.05.2012, 23:26  [ТС]
Ошибки нету не какой, просто текст теряется и мясо получается при выводе...
В Общем тока 1 вариант лочить всё
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
08.05.2012, 23:45
а что дальше с данными ты делаешь? прочитал строку одним потоком, а дальше что? просто если ты хочешь прочытать текст несколькими потоками, то в этом должна быть логика и продолжение. Вот именно, что получается мясо, а если лочить чтение одной строки, тогда каждому потоку будет передаваться по строке.
0
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46
09.05.2012, 00:14  [ТС]
Дальше идёт запрос с этими данными, где и нужны потоки..
0
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
09.05.2012, 00:19
shafttt, почитай про семафоры и мьютексы.
Чем тебя не устраивает вариант вычитки файла в 1 поток скажем, в конструкторе класса, а потом при создании потоков раздавать им нужные строки? ведь при использовании мьютекса, быстродействие извлечения строк из файла ничем не будет отличатся от однопоточного решения.
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
09.05.2012, 12:03
приблизительно можно сделать так

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
64
65
66
using System.IO;
using System.Threading;
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        static object thisLock = new object();
        List<string> list = new List<string>();
        Thread[] potok = new Thread[3];
        Thread th;
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string line;
            StreamReader reader = new StreamReader("proba.txt");
            while ((line = reader.ReadLine()) != null)
            {
                string[] split = line.Split('\n');
                list.AddRange(split);
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string line;
            StreamReader reader = new StreamReader("proba.txt");
            while ((line = reader.ReadLine()) != null)
            {
                string[] split = line.Split('\n');
                list.AddRange(split);
            }
 
 
            for (int i = 0; i < potok.Length; i++)
            {
                potok[i] = new Thread(new ThreadStart(proc));
                potok[i].IsBackground = true;
                Thread.Sleep(1000);
                potok[i].Start();
            }
        }
 
        private void proc()
        {
            int ptr = 0;
            while (ptr < list.Count)
            {
                string curVal;
                lock(thisLock)
                {
                    curVal = list[ptr++];
                }
       
                    if (listBox1.InvokeRequired) listBox1.BeginInvoke(new Action(() => { listBox1.Items.Add(list[curVal] + " // thread number:" + Thread.CurrentThread.ManagedThreadId); }));
                    else listBox1.Items.Add(list[curVal] + " // thread number:" + Thread.CurrentThread.ManagedThreadId);
            }
        }
    }
}
0
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46
09.05.2012, 12:16  [ТС]
Сделал так...

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
 bool CanRead = false;
        //
        StreamReader sr = null;
        //
        private Object lockThis = new Object();
         
       
        private void button1_Click(object sender, EventArgs e)
        {
            sr = File.OpenText("acc.txt");
            CanRead = true;
            int i = Convert.ToInt32(textBox2.Text);
            
            
            for (int p = 0; p < i; p++)
            {
                Thread t = new Thread(pop);
                t.Start();
                
            }
        }
 
 
 private void pop()
        {
            var sync = SynchronizationContext.Current;
            string st;
            string mail;
            string password;
            string user;
            string domain;
            
 
            while (true)
            {
                lock (lockThis)
                {
 
                    if (CanRead)
                    {
                        
                        st = sr.ReadLine();
                        
                        if (st == null)
                        {
                            CanRead = false;
                            sr.Close();
                            break;
                        }//if (st == null)
 
                        lock (lockThis) textBox1.Invoke((MethodInvoker)delegate { textBox1.Text += st + "\n"; });
                        
                      
                    }//if (CanRead)
 
                    else break;
                }// lock (lockThis)
 
                 try
                    {
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
09.05.2012, 13:40
в принципе можно, но всегда старайтесь лочить как можно меньше кода.
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
09.05.2012, 17:17
shafttt, зачем оно тебе вообще надо? не проще ли юзать http://redis.io/ ?
0
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46
09.05.2012, 17:48  [ТС]
outoftime, Я разобрался норм всё!
0
87 / 73 / 6
Регистрация: 11.09.2011
Сообщений: 118
09.05.2012, 22:17
Я бы для начала объявил структуру, которая будет хранить данные об аккаунте, например:
C#
1
2
3
4
5
6
7
8
9
10
11
struct Account
    {
         //Добавь еще какие тебе нужны поля, если нужны
         public string email;
         public string password;
         public Account(string email, string password)
         {
           this.email = email;
           this.password = password;
         }
}
Потом считал бы сразу данные о всех аккаунтах из нашего файла в очередь (Queue):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        Queue<Account> accounts;
        private void LoadAccounts()
        {
            accounts = new Queue<Account>();
            foreach (string line in File.ReadAllLines("acc.txt"))
            {
                string[] data = line.Split(':');
                //Тут тоже надо будет переписать, если нужны какие-то данные кроме мыла
                //и пароля
                Account account = new Account(data[0], data[1]);
                accounts.Enqueue(account);
            }
        }
А потом уже в потоках брал бы данные из коллекции, а не файла:
C#
1
2
3
4
5
6
7
private void Pop()
        {
            if (accounts.Count == 0)
                return;
            Account account = accounts.Dequeue();
            //Делаешь что хочешь с данными
        }
1
0 / 0 / 1
Регистрация: 01.04.2012
Сообщений: 46
09.05.2012, 22:59  [ТС]
Niades, Это уже интересней...
а оперативки будет больше кушать?
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
09.05.2012, 23:51
можно сделать так
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace WindowsFormsApplication2
{
    public class DataAccount
    {
        public string Email { get; set; }
        public string Domain { get; set; }
 
        public DataAccount(string email, string domain)
        {
            Email = email;
            Domain = domain;
        }
    }
 
    public class ParseEventArgs:EventArgs
    {
        public List<DataAccount> Accounts { get; set; }
 
        public ParseEventArgs(List<DataAccount> accounts)
        { Accounts = accounts; }
    }
 
    public class ParserAccounts
    {
        public event EventHandler<ParseEventArgs> Parsed = delegate { };
 
        protected IEnumerable<string> GetFileData(StreamReader reader)
        {
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
        }
 
        protected Match GetMatch(string data, string pattern)
        { return Regex.Match(data, pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); }
 
        protected string GetValueMatch(string data, string pattern)
        {
            Match match = GetMatch(data, pattern);
            if (match.Success)
                return match.Value;
            return string.Empty;
        }
 
        protected string ParseEmail(string data)
        {
            const string pattern = @"([^>]*)@";
            return GetValueMatch(data, pattern);
        }
 
        protected string ParseDomain(string data)
        {
            const string pattern = @"@([^>]*)";
            return GetValueMatch(data, pattern);
        }
 
        public void Parse(string pathToFile)
        {
            ThreadPool.QueueUserWorkItem((object sender) =>
            {
 
                string email = string.Empty;
                string domain = string.Empty;
                List<DataAccount> accounts = new List<DataAccount>();
                using (StreamReader reader = File.OpenText(pathToFile))
                    foreach (string value in GetFileData(reader))
                    {
                        email = ParseEmail(value);
                        domain = ParseDomain(value);
                        accounts.Add(new DataAccount(email, domain));
                    }
                Parsed(this, new ParseEventArgs(accounts));
            }); 
        }
    }
}
а потом
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
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;
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            ParserAccounts parser = new ParserAccounts();
            parser.Parsed += new EventHandler<ParseEventArgs>(parser_Parsed);
            parser.Parse("account.txt");
        }
 
        void parser_Parsed(object sender, ParseEventArgs e)
        {
            //e.Accounts <- твоя коллекция акков
            //твой код обработки акков
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2012, 23:51
Помогаю со студенческими работами здесь

Организовать работу с файлом
Добрый день, недавно начал изучать Phyton и наткнулся на такую задачу, которая мне не по силам. Хочется узнать как делать задачи такого...

Организовать работу с файлом при помощи меню
Если кто может, то помогите. Программа создает текстовый файл в текущей папке. Организовать работу с файлом при помощи меню: ...

Организовать работу с файлом, содержащим сведения об автовладельцах
Как организовать работу с файлом, содержащим следующие сведения об автовладельцах: ФИО, год рождения, марка автомобиля, год выпуска ...

Организовать работу с файлом, содержащим сведения о сотрудниках фирмы
Люди добрые, помогите с задачей. Заранее огромное спасибо. Организовать работу с файлом, содержащим следующие сведения о сотрудниках...

Организовать работу с файлом: запись, сортировка, удаление данных
Прошу помощи в составлении программы на языке Паскаль. Условие задачи следующее: Разработать алгоритм и программу. Компонентами...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru