Потоки + Windows Forms (Visual Studio 2005)

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

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

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Потоки + Windows Forms (Visual Studio 2005)

Сообщение Ramzes » 20.03.2006 (Пн) 10:42

вопрос возможно глупый но:
в 2003 студии я писал так:
Код: Выделить всё
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf SSort))

Затем в процедуре
Код: Выделить всё
private sub Ssort(obj as object)
form1.button1.visible=false
end sub


и у меня все работало...теперь, когда я заимел 2005 студию, и перевел на нее проэкт, мне говорит, что так делать нельзя...Исключение :(

Вопрос: как правильно получить доступ к Windows формам из потоков :?:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.03.2006 (Пн) 11:52

Control.Invoke Method (Delegate, Object[])

[здесь была длинная и ненужная ссылка, из-за которой разлезалась страница]
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 20.03.2006 (Пн) 11:55

Nord777

А что за сссылка то? У меня нет в MSDN этого (учитывай то, что не у всех есть MSDN? посему лучше давать ссылки на онлайн ресурс)

minotawr
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 195
Зарегистрирован: 08.01.2006 (Вс) 12:38
Откуда: Курск

Сообщение minotawr » 20.03.2006 (Пн) 12:39

Ramzes писал(а):Nord777

А что за сссылка то? У меня нет в MSDN этого

Енто ссылка на MSDN идущий вместе с VS2005 :)

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 20.03.2006 (Пн) 13:13

minotawr
понимаешь...а нет у меня MSDN, и хоть ты тресни :lol:
просто если бы был, я бы не спрашивал :roll:
А онлайн...у меня доступ к энтому ресурсу закрыт :cry: админы постарались :cry:

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 20.03.2006 (Пн) 16:48

Код: Выделить всё
Delegate Sub ChangeVisStatus(ByVal Status As Integer)
Public MyDel As New ChangeVisStatus(AddressOf onChangeVisStatus)

private sub Ssort(obj as object)
     ME.button1.Invoke(MyDel , New Object () {"0"})
end sub

Private Sub onChangeVisStatus(ByVal Status As Integer)
     ME.button1.Visible = Cbool( Status)
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.03.2006 (Пн) 17:12

Ramzes
Вопрос безусловно глупый.
Глупый не по сути своей, а потому, что http://bbs.vbstreets.ru/viewtopic.php?t=20386. Потому что http://bbs.vbstreets.ru/viewtopic.php?t=13297. И, наконец, потому что http://bbs.vbstreets.ru/viewtopic.php?t=15172.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 20.03.2006 (Пн) 17:40

:oops:
Простите, я больше не буду :cry: :oops:
Мне стыдно...действительно очень стыдно... :oops:

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 21.03.2006 (Вт) 1:48

Есть еще один способ.
Хорош тем, что если надо менять много свойств и в разное время -
не придется писать отдельную процедуру для изменения каждого свойства.
Небольшой пример это демонстрирует:
Код: Выделить всё
     Dim Thr As Threading.Thread
    Dim DelegateSetText As [Delegate]
    Dim DelegateGetText As [Delegate]
    Dim DelegateSetVisible As [Delegate]

    'Делегат на 'функцию без параметров' или 'свойство с модификатором Get'
    Private Delegate Function ReturnParam(Of TReturn)() As TReturn

    'Делегат на 'функцию' с двумя входными параметрами
    Private Delegate Function OtherParam(Of TParameter0, TParametr1, TReturn) _
    (ByVal p0 As TParameter0, ByVal p1 As TParametr1) As TReturn

    'Делегат на метод с одним параметром или 'свойство с модификатором Set'
    Private Delegate Sub OneParam(Of TParameter0)(ByVal p0 As TParameter0)

    'Делегат на метод с двумя параметрами
    Private Delegate Sub TwoParam(Of TParameter0, TParametr1) _
    (ByVal p0 As TParameter0, ByVal p1 As TParametr1)

    Private Sub Button_Click(...) Handles ...
        Thr = New Threading.Thread(AddressOf Me.ThreadSub)
        Thr.Start()
    End Sub

    Public Sub ThreadSub()
        '==========================================
        'Создание делегатов для нужных нам свойств:
        'Label1.Text и Label1.Visible
        DelegateSetText = [Delegate].CreateDelegate( _
        GetType(OneParam(Of String)), Label1, "set_Text", False)

        DelegateGetText = [Delegate].CreateDelegate( _
        GetType(ReturnParam(Of String)), Label1, "get_Text", False)

        DelegateSetVisible = [Delegate].CreateDelegate( _
        GetType(OneParam(Of Boolean)), Label1, "set_Visible", False)
        '===========================================

        For i As Integer = 1 To 10
            Label1.Invoke(DelegateSetText, New Object() {Now.ToString})
            Threading.Thread.Sleep(1000)
            Label1.Invoke(DelegateSetVisible, New Object() {Not Label1.Visible})
        Next
    End Sub

    Private Sub Form_FormClosing(...) Handles ...
        Thr.Abort()
        Thr = Nothing
    End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 21.03.2006 (Вт) 9:47

А если понадобится выставить свойство Text у многих контролов в одно и тоже значение, то можно обьединить делегаты:
Код: Выделить всё
Dim DelegateAllText As [Delegate] = [Delegate].Combine( _
[Delegate].CreateDelegate(GetType(OneParam(Of String)), Label1, "set_Text", False), _
[Delegate].CreateDelegate(GetType(OneParam(Of String)), Me, "set_Text", False), _
[Delegate].CreateDelegate(GetType(OneParam(Of String)), Button1, "set_Text", False), _
[Delegate].CreateDelegate(GetType(OneParam(Of String)), TextBox1, "set_Text", False))

Me.Invoke(DelegateAllText, New Object() {Now.ToString})
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


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

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

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

    TopList