Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
6 / 6 / 1
Регистрация: 21.01.2012
Сообщений: 92

Разбивка цикла на несколько потоков

04.03.2020, 22:32. Показов 727. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Подскажите каким образом я могу разбить выполнение цикла на 2 потока?
Есть у меня 2 таблицы DataTable с полученными данными с сервера (DT_uch и DT_uvol).
В DT_uch нужно подтянуть часть данных из таблицы DT_uvol, для чего прогоняюсь по ним в цикле (по времени занимает чуть больше минуты и это слишком много).

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim scepka_uch1, scepka_uvol1 As String
        For i1 = 0 To DT_uch.Rows.Count - 1
            scepka_uch1 = DT_uch.Rows.Item(i1)(8).ToString & DT_uch.Rows.Item(i1)(11).ToString
            DT_uch.Rows.Item(i1)(13) = "1"
            For k1 = 0 To DT_uvol.Rows.Count - 1
                scepka_uvol1 = DT_uvol.Rows.Item(k1)(2).ToString & DT_uvol.Rows.Item(k1)(3).ToString
 
                If scepka_uch1 = scepka_uvol1 And DT_uvol.Rows.Item(k1)(7).ToString <> "" Then
                    DT_uch.Rows.Item(i1)(14) = "1"
                    DT_uch.Rows.Item(i1)(13) = "0"
                    DT_uch.Rows.Item(i1)(25) = DT_uvol.Rows.Item(k1)(7).ToString
                    If FormatDateTime(If(DT_uvol.Rows.Item(k1)(5).ToString = "", "01.01.2090", DT_uvol.Rows.Item(k1)(5)), DateFormat.ShortDate) < If(DT_uch.Rows.Item(i1)(12).ToString = "", "01.01.1900", FormatDateTime(DT_uch.Rows.Item(i1)(12), DateFormat.ShortDate)) Then
                        DT_uch.Rows.Item(i1)(17) = "1"
                    End If
                    Exit For
 
                End If
 
            Next k1
 
        Next i1
Сделал 2 потока после того как данные в обе DataTable получены:

VB.NET
1
2
3
4
Dim Поток1 As New System.Threading.Thread(AddressOf Процесс_потока1)
        Dim Поток2 As New System.Threading.Thread(AddressOf Процесс_потока2)
        Поток1.Start()
        Поток2.Start()
В первом потоке цикл от 0 до 7000, во втором от 7001 до конца таблицы.
Первый поток выполняется без проблем, а вот второй каждый раз выдает ошибку, что индекс i1 за границами диапазона и значение i1 каждый раз разное, но не выходящее за границы диапазона (данных в DT_uch 12800 и постепенно растет)

Подскажите, может есть другой способ разбить цикл на 2 и более потока, которые будут одновременно выполняться?
Или же может ткнете где я что сделал не так.
Заранее благодарен.

VB.NET
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
Sub Процесс_потока2()
        Dim scepka_uch1, scepka_uvol1 As String
        For i1 = 7001 To DT_uch.Rows.Count - 1
            scepka_uch1 = DT_uch.Rows.Item(i1)(8).ToString & DT_uch.Rows.Item(i1)(11).ToString
            DT_uch.Rows.Item(i1)(13) = "1"
            For k1 = 0 To DT_uvol.Rows.Count - 1
                scepka_uvol1 = DT_uvol.Rows.Item(k1)(2).ToString & DT_uvol.Rows.Item(k1)(3).ToString
 
                If scepka_uch1 = scepka_uvol1 And DT_uvol.Rows.Item(k1)(7).ToString <> "" Then
                    DT_uch.Rows.Item(i1)(14) = "1"
                    DT_uch.Rows.Item(i1)(13) = "0"
                    DT_uch.Rows.Item(i1)(25) = DT_uvol.Rows.Item(k1)(7).ToString
                    If FormatDateTime(If(DT_uvol.Rows.Item(k1)(5).ToString = "", "01.01.2090", DT_uvol.Rows.Item(k1)(5)), DateFormat.ShortDate) < If(DT_uch.Rows.Item(i1)(12).ToString = "", "01.01.1900", FormatDateTime(DT_uch.Rows.Item(i1)(12), DateFormat.ShortDate)) Then
                        DT_uch.Rows.Item(i1)(17) = "1"
                    End If
                    Exit For
 
                End If
 
            Next k1
 
        Next i1
        MsgBox("Done")
        
    End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2020, 22:32
Ответы с готовыми решениями:

Обработка цикла в несколько потоков
Сначала попробую описать что мне нужно сделать: Есть список ссылок. Нужно в несколько потоков(допустим 5) отсылать данные пост...

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

Разбивка List'a на несколько
Добрый вечер. Допустим у меня есть список из n элементов. Как мне его разбить на m списков по k элементов в каждом? (n = m*k)

2
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
04.03.2020, 22:47
Вы пытаетесь одной функцией решить две разные задачи: получение данных и их отображение.

Рекомендую сделать рефакторинг.
1. Одна функция получает данные.
2. Вторая функция засовывает их в таблицу.
1
6 / 6 / 1
Регистрация: 21.01.2012
Сообщений: 92
04.03.2020, 22:52  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы пытаетесь одной функцией решить две разные задачи: получение данных и их отображение.

Рекомендую сделать рефакторинг.
1. Одна функция получает данные.
2. Вторая функция засовывает их в таблицу.
Замабувараев, можете небольшой пример привести? В моем случае не до конца понимаю как я могу это сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2020, 22:52
Помогаю со студенческими работами здесь

Разбивка одного столбца на несколько
Добрый день. Проблема состоит в следующем: есть две таблицы Project и Budget связаны по полям Project.Id и Budget.Project. Нужно вывести...

Разбивка таблицы в WORD на несколько документов
Здравствуйте, поставили задачу разбить таблицу, которая создана в WORD (каталог) на отдельные документы *.doc. Объем грандиозный, а...

Разбивка одного текстового файла на несколько
Всем привет!) помогите пожалуйста , я хочу реализовать такую программу: Допустим имеется текстовый файл на 10231 строк. Надо...

Разбивка файла StreamWriter-ом на несколько файлов
Приветствую, есть файл содержащий очень много строк и как бы разбитый на блоки строкой $$$$, надо: 1) этот файл разбить на несколько...

Access 2007. Разбивка строк на несколько по условию
Доброго всем времени суток! Столкнулся с неразрешимой проблемой: Имеется таблица с данными вида: ID, Name1, Name2, Name3, Match ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru