Страница: 1 | 2 |
Вопрос: Обновление интерфейса из другого потока
Добавлено: 22.02.08 07:45
Автор вопроса:
Legon
Ответы
Всего ответов: 19
Номер ответа: 16
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #16
Добавлено: 24.02.08 13:11
Этот механизм работает очень хорошо и я его неоднократно использовал, никаких проблем с ним не возникало.
Если какие-то проблемы и есть - то, я как у же говорил, могут быть они связаны только с тем что используется не глобальная ссылка.
Номер ответа: 17
Автор ответа: Legon
Вопросов: 4
Ответов: 32
Профиль | | #17
Добавлено: 24.02.08 13:36
Переделал я все по новой схеме. Стало легче понимать, более компактно смотрится и ... не работает.
В смысле: все работает, все копируется, а обновляется неизвестное окно.
Imports System.IO
Public Class frmMain
Public WithEvents FO As New FileOperations
Public frmST As New frmStatus 'общая переменная на диалоговую форму
Dim Thrd As Thread
'************************* обработчики делегатов
Public Sub PBChangeValue(ByVal curPercent As Double)
frmST.PB.Value = curPercent 'ОБНОВЛЯЕТ НЕИЗВЕСТНОЕ ОКНО
End Sub
Public Sub FileChangeValue(ByVal curFile As String)
frmST.lblFile.Text = curFile 'ОБНОВЛЯЕТ НЕИЗВЕСТНОЕ ОКНО
MsgBox(frmST.lblFile.Text) 'проверка
End Sub
'*************************** конец обработчиков делегатов
Private Sub FO_Done() Handles FO.Done
'frmST.Text = "OK" - возникнет ошибка доступа из другого потока
frmST.DialogResult = Windows.Forms.DialogResult.OK 'Правильно закрывает окно
End Sub
'******* код программы
'*******
Private Sub cmdCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCopy.Click
With frmST
.lblStatus.Text = "Подождите. Идет копирование файла:"
.Text = "Копирование..."
.lblFile.Text = ""
.lblTitle.Text = "Копирование"
.tEffect = .lblTitle.Text
.lblTitle.ForeColor = Color.Blue
.lblPath.Text = "в " & tPath
End With
'**********************************
StartOperation()
Dim r As DialogResult
r = frmST.ShowDialog()
Select Case r
Case Windows.Forms.DialogResult.Cancel
MsgBox("Cancel"
Case Windows.Forms.DialogResult.OK
MsgBox("Complate"
End Select
End Sub
Public Sub StartOperation()
'***передача списка параметров классу
'...
'*****
FO.tPath = FolderB.SelectedPath
Thrd = New Thread(AddressOf FO.Copy)
Thrd.Name = "Test"
Thrd.Start()
Class FileOperations
Public Class LFile
Dim _Name As String
Dim _Path As String
Public Property Name()
'***
End Property
'***
End Property
End Class
Public FileList As New ArrayList
Public curFile As String
Public tPath As String
Public Event Done()
Public Delegate Sub DelegatePBChangeValue(ByVal curPercent As Double)
Public Delegate Sub DelegateFileChangeValue(ByVal curFile As String)
Public Sub Copy()
Dim MyDelegateFile As New DelegateFileChangeValue(AddressOf frmMain.FileChangeValue)
Dim MyDelegatePB As New DelegatePBChangeValue(AddressOf frmMain.PBChangeValue)
Dim i As Long
Dim tPer As Double
Dim cPer As Double
Dim tFile As LFile
cPer = 100 / FileList.Count
For i = 0 To FileList.Count - 1
tFile = CType(FileList(i), LFile)
MyDelegateFile.Invoke(tFile.Name)
File.Copy(tFile.Path, Path.Combine(tPath, tFile.Name))
tPer += cPer
MyDelegatePB.Invoke(tPer)
Next
RaiseEvent Done()
End Sub
End Class
End Class
З.Ы. Могу выложить исходники, если надо.
З.З.Ы. А вообще, спасибо вам всем. У меня действительно большие продвижения. (я разобрался, что такое делегаты и т.д.) Жаль, что до конца оно так и не работает...
Номер ответа: 18
Автор ответа: Legon
Вопросов: 4
Ответов: 32
Профиль | | #18
Добавлено: 24.02.08 13:45
ошибочка в листинге:
'***передача списка параметров классу
'...
'*****
FO.tPath = FolderB.SelectedPath
Thrd = New Thread(AddressOf FO.Copy)
Thrd.Name = "Test"
Thrd.Start()
End Sub 'Забыл скопировать строчку
Номер ответа: 19
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #19
Добавлено: 24.02.08 15:01
стукни мне в аську.