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

Собственный поток для каждого Listbox.Items

01.11.2016, 01:39. Показов 527. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В моём примере каждый поток обрабатывает каждое значение из ListBox1:
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
26
27
28
29
30
31
32
33
34
Imports System.Threading
Public Class Form1
    Public Delegate Sub delegate_fill_list(list_line As String)
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For i = 1 To 5
            ListBox1.Items.Add(i)
        Next
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim threads As New List(Of Thread)()
        For i As Integer = 0 To ListBox1.Items.Count
            threads.Add(New Thread(AddressOf fill_list))
            threads(i).IsBackground = True
            threads(i).Start()
        Next
    End Sub
 
    Public Sub fill_list()
        For i = 0 To ListBox1.Items.Count - 1
            Dim list1_line As String = ListBox1.Items(i).ToString
            add_line(list1_line * 5)
            Thread.Sleep(1000)
        Next
    End Sub
 
    Public Sub add_line(line As String)
        If ListBox2.InvokeRequired Then
            Invoke(New delegate_fill_list(AddressOf add_line), line)
        Else
            ListBox2.Items.Add(line)
        End If
    End Sub
End Class
а мне нужно чтобы первый поток обрабатывал первое значение, второй - второе, третий - третье и т.д.

ВАЖНО!!! Ithem-ов в ListBox1 может быть намного больше, поэтому писать для каждого свой Sub() не вариант!!!
Подскажите, как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 01:39
Ответы с готовыми решениями:

Удаление одинаковых Items из Listbox
Поделитесь решением, наверняка есть уже обкатанный велосипед. И кстати, я хотел еще на стадии...

ListBox: Свойство Items помечено как ReadOnly
Свойство Items помечено как ReadOnly. Где снять это свойство?

Как сделать границы для items в ListBox?
Как сделать границы для items в listbox?

Перенос Items из Listbox 1-ой формы в Listbox 2-ой. Сохранение изменений
Добрый день, изучаю C#, пользуюсь Visual Studio 2015, Windows Forms. Проблема такова: На первой...

3
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
01.11.2016, 02:07 2
Sega71, вот так, но толку от такой многопоточности очень мало т.к. у всех потоков будет одно узкое место - вызов Invoke. При большом кол-ве элементов это решение скорее всего будет работать медленнее чем один поток.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim threads As New List(Of Thread)()
    For i As Integer = 0 To ListBox1.Items.Count-1
        threads.Add(New Thread(AddressOf fill_list))
        threads(i).IsBackground = True
        threads(i).Start(ListBox1.Items(i))
    Next
End Sub
 
Public Sub fill_list(item As Object)
    Dim list1_line As String = item.ToString
    add_line(list1_line * 5)
End Sub
 
Public Sub add_line(line As String)
    If ListBox2.InvokeRequired Then
        Invoke(New delegate_fill_list(AddressOf add_line), line)
    Else
        ListBox2.Items.Add(line)
    End If
End Sub
1
8 / 2 / 1
Регистрация: 10.08.2011
Сообщений: 68
01.11.2016, 16:28  [ТС] 3
OwenGlendower, Спасибо, код работает, но есть одно "НО": на время выполнения форма зависает, как от этого избавиться?
Пришла в голову такая мысль: отследить, если предыдущий поток завершен, то запустить следующий, но не знаю как работать с номерами потоков:
VB.NET
1
2
3
            If threads(i).IsAlive = False Then
                threads(i).Start(ListBox1.Items(i))
            End If
так мы отслеживаем существует ли создаваемый поток, а нужно предыдущий, что то типа этого:
VB.NET
1
2
3
            If threads(i - 1).IsAlive = False Then
                threads(i).Start(ListBox1.Items(i))
            End If
Добавлено через 2 часа 45 минут
C одним потоком тоже самое - форма висит до завершения работы со всеми ListBox.Items даже при проверке "жив" ли поток:
VB.NET
1
2
3
4
5
6
7
        For i As Integer = 0 To ListBox1.Items.Count - 1
            Dim wrk_thread As New Thread(AddressOf fill_list)
            wrk_thread.IsBackground = True
            If wrk_thread.IsAlive = False Then
                wrk_thread.Start(ListBox1.Items(i))
            End If
        Next
в функцию добавил Thread.Sleep не помогло:
VB.NET
1
2
3
4
5
6
    Public Sub fill_list(item As Object)
        Dim list1_line As String = item.ToString
        Thread.Sleep(1000)
        add_line(list1_line * 5)
        ' Thread.Sleep(1000)
    End Sub
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
01.11.2016, 19:01 4
Sega71, раз единственное что делает твой код это обновление UI то никакой пользы от потоков здесь нет. Почему ты решил их применять?

Цитата Сообщение от Sega71 Посмотреть сообщение
на время выполнения форма зависает, как от этого избавиться?
Invoke делает свою работу в контексте UI потока. Пока он работает UI не может ообновляться. Если делать вызовы очень часто как в моем примере, то приложение неизбежно подвиснет. При большом количестве элементов имеет смысл переключиться в виртуальный режим.

Цитата Сообщение от Sega71 Посмотреть сообщение
форма висит до завершения работы со всеми ListBox.Items даже при проверке "жив" ли поток:
VB.NET
1
2
3
Dim wrk_thread As New Thread(AddressOf fill_list)
wrk_thread.IsBackground = True
If wrk_thread.IsAlive = False Then
Это проверка всегда вернет True т.к. новый поток по определению "не живой".
0
01.11.2016, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2016, 19:01
Помогаю со студенческими работами здесь

Пустой Список Элементов Редактора Коллекции: Items при создании ContextMenu для ListBox
Всем готовым помочь неофиту мои приветствия. Пытаюсь быстро соорудить некую форму в Visual...

Свой компонент от ListBox. Не могу задать свой тип для Items
День добрый господа. Нуждаюсь в вашей помощи. Суть такова, что я желаю создать свой компонент на...

ListBox и items
Подскажите пожалуйста, есть листбокс надо создать баттон что бы при нажатии на кнопку выходил итемс...

ListBox и items
Подскажите пожалуйста, в ListBox в разделе items сформированно 10 линий, надо сделать что бы когда...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru