Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 6

Многопоточность

27.05.2013, 17:32. Показов 4066. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем вот что имею
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
    public int index = -1;
    public int count = 10;
 
    private static readonly object SyncIndex = new object();
    private static readonly object SyncFiles = new object();
 
    private void button1_Click(object sender, EventArgs e)
    {
        CreateThreads(3);
    }
 
    public void CreateThreads(int threads)
    {
        Thread[] threadArray;
        for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
        {
            threadArray[i] = new Thread(this.Run) { IsBackground = true };
            threadArray[i].Start();
        }
    }
 
          public void Run()
    {
 
        while (index < count)
        {
            // теперь из-за lock всё это выполняется считай в 1 поток...
            lock (SyncFiles) {
                if (index > count)
                {
                    break;
                }
                else
                {
                    index++;
                    SaveText("file.txt", index.ToString());
                }
           }
            // теперь из-за lock всё это выполняется считай в 1 поток...
        }
 
     }
 
    private static void SaveText(string file, string text)
    {
        try
        {
            var write = new StreamWriter(file, true);
            write.WriteLine(text);
            write.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
TextWriter.Synchronized, lock, semaphore - как лучше сделать?
точнее вообще как это сделать.
Цель: многопоточный генератор цифр от 1 до 1000 (к примеру), а на самом деле чекер с get запросом

Добавлено через 13 минут
вообщем проблема больше в сохранении, 100 потоков же не могут записывать в один файл, так вот как бы реализовать эту очередь для потоков?

Добавлено через 27 минут
поискал ей богу ничего для себя не нашёл(
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2013, 17:32
Ответы с готовыми решениями:

Многопоточность
Доброго времени суток! Пишу довольно редко, самостоятельно не получилось разобраться:( Сразу перейду к задаче. Допустим есть цикл: ...

Многопоточность
Здравствуйте. Есть два потока. Объясните пожалуйста, для чего выполнять вот такую проверку? Почему не достаточно одного из условий, а...

Многопоточность в C#
Уважаемые, программисты! Помогите, пожалуйста, реализовать пример с потоками. Мне нужно для примера, чтобы в первом потоке на форме...

10
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
27.05.2013, 18:49
добавляйте текст в какой то массив, после того как все потоки добавят что нужно, записывайте этот массив в файл, а не пишите файл сотней потоков одновременно, хотя наверно, есть решения и с записью через множество потоков
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 6
27.05.2013, 19:02  [ТС]
Цитата Сообщение от Монфрид Посмотреть сообщение
добавляйте текст в какой то массив, после того как все потоки добавят что нужно, записывайте этот массив в файл, а не пишите файл сотней потоков одновременно, хотя наверно, есть решения и с записью через множество потоков
Да, как вариант, спасибо. Но хочется всё-таки сразу писать в текстовик, так что если знает кто, пожалуйста поделитесь!
0
63 / 62 / 11
Регистрация: 28.12.2011
Сообщений: 280
28.05.2013, 05:20
Можно попробовать ReaderWriterLockSlim
ну вот как-то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
   private static void SaveText(string file, string text)
    {
        cacheLock.EnterWriteLock();
        try
        {
            var write = new StreamWriter(file, true);
            write.WriteLine(text);
            write.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
             cacheLock.ExitWriteLock();
        }
    }
1
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 6
28.05.2013, 10:32  [ТС]
Good1101, спасибо, стало лучше))
теперь другая беда, изменил кодик↓
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
public void Run()
        {
            while (index < count)
            {
                lock (SyncIndex) { index++; }
 
                string resp = Check(index.ToString());
 
                if (resp == "true")
                {
                    SaveText("good.txt", index.ToString());
                }
                else
                {
                    SaveText("bad.txt", index.ToString());
                }
 
            }
         }
 
        public string Check(string login)
        {
            try
            {
                WebClient client = new WebClient();
                string reply = client.DownloadString("http://domain.ru/test.php?count=" + login);
                if (reply.Contains("true"))
                {
                    return "true";
                }
                else
                {
                    return "false";
                }
            }
            catch
            {
                Check(login);
            }
            return "";
        }
всё это начинаю долбить в 300 потоков, на выходе в текстовике
bad.txt 299
299
301
302
303
303
305
303
305
303
305
310
311
310
311
310
310

в good.txt
311

вообщем почему он начал с 300? где я накосячил? как-то криво синхронизировал?
0
63 / 62 / 11
Регистрация: 28.12.2011
Сообщений: 280
28.05.2013, 10:37
IFursov, а вы уверены что вам нужны 300 потоков?
0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 6
28.05.2013, 16:36  [ТС]
Цитата Сообщение от Good1101 Посмотреть сообщение
IFursov, а вы уверены что вам нужны 300 потоков?
уверен)) на обработку 10 000, поэтому в 300 потоков.

Добавлено через 1 час 17 минут
p.s переделал) всё, пока что вопросов нет)) ещё раз всем спасибо!

Добавлено через 1 минуту
p.s.s хотя не, трабл.

Добавлено через 2 часа 7 минут
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
        public int index = -1;
        public int count = 1000;
 
        private void btStart_Click(object sender, EventArgs e)
        {
            CreateThreads(300);
        }
 
        public void CreateThreads(int threads)
        {
            Thread[] threadArray;
            for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
            {
                threadArray[i] = new Thread(this.Run) { IsBackground = true };
                threadArray[i].Start();
            }
        }
 
        public void Run()
        {
            while (index < count)
            {
                index++;
                Check(index.ToString());
            }
         }
 
        public string Check(string login)
        {
            try
            {
                System.Net.WebRequest reqGET = System.Net.WebRequest.Create(@"http://www.minecraft.net/haspaid.jsp?user=" + login);
                System.Net.WebResponse resp = reqGET.GetResponse();
                System.IO.Stream stream = resp.GetResponseStream();
                System.IO.StreamReader sr = new System.IO.StreamReader(stream);
                string s = sr.ReadToEnd();
 
                if (s.Contains("true"))
                {
                    SaveText("good.txt", login);
                }
                else
                {
                    SaveText("bad.txt", login);
                }
            }
            catch
            {
                Check(login);
            }
            return "";
        }
 
        static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
        private static void SaveText(string file, string text)
        {
            cacheLock.EnterWriteLock();
            try
            {
                var write = new StreamWriter(file, true);
                write.WriteLine(text);
                write.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                cacheLock.ExitWriteLock();
            }
        }
Добавлено через 1 минуту
вот так выглядит код сейчас, как-то медленно всё выходит, очередь на запись, пока очередь эта не кончится он не продолжает чекать

Добавлено через 2 часа 12 минут
вверх
0
28.05.2013, 17:35

Не по теме:

А 300 потоков что вместе работать будут? Я думал что по потоку на процессор...

0
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 6
28.05.2013, 18:25  [ТС]
Цитата Сообщение от phantom96 Посмотреть сообщение

Не по теме:

А 300 потоков что вместе работать будут? Я думал что по потоку на процессор...



ребята, ну кто знает как реализовать многопоточный брут\чекер ... хелп. симафоры, lcok'ки всякие.
0
63 / 62 / 11
Регистрация: 28.12.2011
Сообщений: 280
30.05.2013, 18:37
Цитата Сообщение от IFursov Посмотреть сообщение
вот так выглядит код сейчас, как-то медленно всё выходит, очередь на запись, пока очередь эта не кончится он не продолжает чекать
если долго пишут, может все же имеет смысл писать отдельным потоком, а все остальные будут добавлять нужный текст в список.
1
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
30.05.2013, 18:42
Используй ConcurrentQueue<T> и заведи отдельный поток, который будет скидывать очередь в файл (но следи за переполнением памяти), а другими потоками добавляй значения через встроенные защищённые методы Try.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2013, 18:42
Помогаю со студенческими работами здесь

Многопоточность
Всем привет, встала резко задача использования многопоточности без повторения переменных массива Итак имеется массив mas состоящий из 100...

Многопоточность
Доброго времени суток всем. Народ задача стоит многопоточное умножение матриц. Ну если я правильно всё догнал, то получается примерно...

Многопоточность
Всем привет. Как реализовать многопоточность с выбором количества потоков? Буду очень благодарен.

Многопоточность
Имеется класс class MainMeneger: Form, в нем объявляются интерфейсы public IMainForm view; public IMessegeService messege; public...

Многопоточность
Здравствуйте. Столкнулся с проблемой, при работе с многопоточностью. Потоки создал так: private void...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru