Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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.Threading
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
ошибочка в листинге:
Public Sub StartOperation()
        '***передача списка параметров классу
'...
'*****
        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
стукни мне в аську.

Ответить

Страница: 1 | 2 |

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



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