Страница: 1 |
Страница: 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 обращайся примерно так
'здесь твои действия......
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:
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:
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