Поток + ListView

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Поток + ListView

Сообщение FireFenix » 28.06.2009 (Вс) 10:37

Хочу обработать ListView элемент в отдельном потоке
Код: Выделить всё
Public Class Main
    Private Core As Core

    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Core = New Core
    End Sub

    Private Sub btn_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Start.Click
        Core.Thread_Manager()
    End Sub

    Public Delegate Sub DlgList(ByVal Index As Integer, ByVal Result As String)
    Public DelegateList As New DlgList(AddressOf List)

    Public Sub List(ByVal Index As Integer, ByVal Result As String)
        If Not Result Is Nothing Then
            lv_List.Items(Index).SubItems(2).Text = Result
        Else
            lv_List.Items(Index).SubItems(2).Text = "not found"
        End If
    End Sub

    Public Delegate Function DlgGetList()
    Public DelegateGetList As New DlgGetList(AddressOf GetList)

    Public Function GetList()
        Dim ListViewItemCollection(lv_List.Items.Count - 1) As ListViewItem

        lv_List.Items.CopyTo(ListViewItemCollection, 0)

        Return ListViewItemCollection
    End Function
End Class

Код: Выделить всё
Class Core
    Public Form As Main = Main
    Public Options As New Main_Class.Options

    Public Sub Thread_Manager()
        ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Process_Work), Nothing)
    End Sub

    Private Sub Process_Work()
        Dim ListViewItemCollection() As ListViewItem = Nothing

        Thread.CurrentThread.IsBackground = True
        ListViewItemCollection = Form.Invoke(Form.DelegateGetList, Nothing)

        For i = 0 To ListViewItemCollection.Count - 1
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Thread_Work), ListViewItemCollection(i))
        Next
    End Sub

    Private Sub Thread_Work(ByVal ListViewItem As ListViewItem)
        Dim Result As String = Nothing

        For j = 0 To UBound(Work_Module.Work_Type)
            If Work_Module.Work_Type(j).Name = ListViewItem.Group.Name Then

                Result = Work_Module.Request(ListViewItem.SubItems(0).Text, Work_Module.Work_Type(j).Site(0))

                Form.Invoke(Form.DelegateList, New Object() {ListViewItem.Index, Result})

                Exit For
            End If
        Next
    End Sub
End Class

И в ходе работы на втором инвоке вылетатет - "Cross-thread operation not valid: Control 'lv_List' accessed from a thread other than the thread it was created on."
Как сделать, чтобы работало?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

GPP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 351
Зарегистрирован: 02.11.2005 (Ср) 8:02
Откуда: г.Невельск о.Сахалин

Re: Поток + ListView

Сообщение GPP » 28.06.2009 (Вс) 14:23

Используй делегаты и Invoke метод. Вот пример:

Код: Выделить всё

Imports System.Threading

Public Class Form1
    Dim Th As New Thread(New ThreadStart(AddressOf ChangeListBox))

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Th.Start()
    End Sub

    Delegate Sub ChangeListBoxDelegate()
    Private Sub ChangeListBox()
        If Me.InvokeRequired Then
            Dim Invoker As New ChangeListBoxDelegate(AddressOf ChangeListBox)
            Me.Invoke(Invoker, New Object() {})
        Else
            For i As Integer = 0 To 10
                ListBox1.Items.Add(i.ToString())
            Next
        End If
    End Sub

End Class

GPP(c) Gorlo Pavel Programming

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поток + ListView

Сообщение FireFenix » 28.06.2009 (Вс) 18:26

GPP писал(а):Используй делегаты и Invoke метод.

а я что использую? =)

Код: Выделить всё
Form.Invoke(Form.DelegateList, New Object() {ListViewItem.Index, Result})

Код: Выделить всё
    Public Delegate Function DlgGetList()
    Public DelegateGetList As New DlgGetList(AddressOf GetList)

    Public Function GetList()
        Dim ListViewItemCollection(lv_List.Items.Count - 1) As ListViewItem

        lv_List.Items.CopyTo(ListViewItemCollection, 0)

        Return ListViewItemCollection
    End Function

Я даже ненаю, что уже копать :cry:
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Re: Поток + ListView

Сообщение Gfif21 » 03.07.2009 (Пт) 19:26

FireFenix писал(а):И в ходе работы на втором инвоке вылетатет - "Cross-thread operation not valid: Control 'lv_List' accessed from a thread other than the thread it was created on."
Как сделать, чтобы работало?


Попробуй в Private Sub Main_Load вставить строку

Код: Выделить всё
lv_List.CheckForIllegalCrossThreadCalls = False

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Поток + ListView

Сообщение Williams » 03.07.2009 (Пт) 21:14

Gfif21 писал(а):
Попробуй в Private Sub Main_Load вставить строку

Код: Выделить всё
lv_List.CheckForIllegalCrossThreadCalls = False


Плохой совет.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Re: Поток + ListView

Сообщение Gfif21 » 04.07.2009 (Сб) 8:24

Williams писал(а):
Gfif21 писал(а):
Попробуй в Private Sub Main_Load вставить строку

Код: Выделить всё
lv_List.CheckForIllegalCrossThreadCalls = False


Плохой совет.


Поясни, почему. А то я VB .NET изучаю недавно. Какие могут быть проблемы? :roll:

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поток + ListView

Сообщение FireFenix » 12.07.2009 (Вс) 19:14

ММММ..... ниукого больше нет идей?
Я теряюсь в догадках почему не работает :( Вроде и так вызываю косвенно через дегаты и инвок :roll:
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Поток + ListView

Сообщение 1Steps » 12.07.2009 (Вс) 22:43

Удалена за ненадобностью.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поток + ListView

Сообщение FireFenix » 13.07.2009 (Пн) 16:28

1Steps писал(а):http://vbnet.ru/forum/show.aspx?id=193612


Я впринципе так и делаю.... ТОлько вот непонимаю из-за чего так происходит.... (Суть ошибки понятна, а причина - нет :( )
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поток + ListView

Сообщение FireFenix » 16.07.2009 (Чт) 0:11

С lv_List.CheckForIllegalCrossThreadCalls = False - отлично работает, но хотелось бы узнать как правильно было бы реализовать
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

    TopList