Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: из tread Добавлено: 28.02.07 15:38  

Автор вопроса:  andor | Web-сайт:
как из tread изменить например своиства text текстбокса?
спасибо

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #1 Добавлено: 28.02.07 23:03
Объяви делегат, который ссылается на метод классе формы (который в свою очередь меняет свойство техтвох-а) Потом из thread синхлокируй текстбокс и через invoke редактируй его

в классе формы обьяви

Delegate Sub SetProgressDelegate(ByVal i As Integer)
Dim SetProgress As SetProgressDelegate = AddressOf SetProgressSub

Private Sub SetProgressSub(ByVal i As Integer, ByVal ProgressBarNum As Integer)
    SyncLock Me
     ProgressBar1.Value = i
    End SyncLock
End Sub




из thread обращайся примерно так
for i= 0 to 100

'здесь твои действия......

  Dim arg(0) As Object
  arg(0) = i
  MyBase.Invoke(SetProgress, arg)
next i

Ответить

Номер ответа: 2
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #2 Добавлено: 28.02.07 23:05
коряво я написал, ну да ВС.НЕТ под рукой нету, главное идею передать

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 01.03.07 04:55
SyncLock не нужен при вызове через Invoke.

Ответить

Номер ответа: 4
Автор ответа:
 andor



Вопросов: 26
Ответов: 37
 Web-сайт:
 Профиль | | #4
Добавлено: 01.03.07 10:00
balshoe spasoba!
a pachemu nada SyncLock ??

Ответить

Номер ответа: 5
Автор ответа:
 andor



Вопросов: 26
Ответов: 37
 Web-сайт:
 Профиль | | #5
Добавлено: 01.03.07 15:13
etot kod rabotaet bez ashibki a vtaroi primer soobshaet vot takoi ashibke:
"Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on."

primer 1:
    Sub TEST()
        SqlCommand1.CommandType = CommandType.StoredProcedure
        SqlCommand1.CommandText = "SP_INS_OR_UPDATE"
        SqlConnection1.Open()
        SqlCommand1.Parameters.Add("@MYPAR", SqlDbType.Int).Value = 0
        

        SqlCommand1.ExecuteNonQuery()

        SqlConnection1.Close()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim thre As New Threading.Thread(AddressOf TEST)
        thre.Start()
    End Sub

primer 2:
    Sub TEST()
        TextBox1.Text = "test"
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim thre As New Threading.Thread(AddressOf TEST)
        thre.Start()
    End Sub

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 01.03.07 22:44
GSerg абсолютно прав.. лучше всего юзать Invoke и только его. Я даже больше скажу... SyncLock штука опасная.. и при неумелом обращении с нею недолго и DeadLock получить с самыми печальными последствиями.. А Invoke, в свою очередь, все это дело грамотно разруливает..

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 01.03.07 22:48
И в MSDN есть, как минимум, 3 примера как избежать Cross-Thread БЕЗ использования SyncLock

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам