Добавление индикатора выполнения при загрузке списка изображений в список с помощью vb.net - PullRequest
0 голосов
/ 07 августа 2011

Я пытаюсь добавить изображения, используя диалоговое окно открытия файла и диалоговое окно просмотра папок, и заполняю список изображений в список. При добавлении этих изображений мне нужно отображать индикатор выполнения для каждого загружаемого изображения.

Я пытаюсь получить это, но когда значение индикатора выполнения говорит что-то около 25 0r 40, оно останавливается в этот момент, но мне нужно показать индикатор выполнения, пока он не завершит 100%, а затем заполняет список изображений.

Как мне это сделать?

Вот мой код:

    Private Sub AddImages_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddImages.Click

    If Not Directory.Exists(Application.StartupPath + "\Backup\") = True Then
        Directory.CreateDirectory(Application.StartupPath + "\Backup\")
    End If



    OpenFileDialog1.FileName = "Select a Image"
    OpenFileDialog1.Multiselect = True
    OpenFileDialog1.InitialDirectory = "C:\Users\Public\Pictures\Sample Pictures"
    OpenFileDialog1.Filter = "All Type Of Image Files|*.*|Joint Photographic Experts Group [JPEG]|*.jpg|Bitmap [BMP|*.bmp|Tagged Image File Format [TIFF]|*.tiff|Portable Network Graphics [PNG]|*.png"
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

        ProgressBar2.Show()
        ProgressBar2.Step = 10
        Dim str As String
        For Each str In OpenFileDialog1.FileNames
            Load.Text = "Loading..."

            Dim fso As New FileSystemObject
            Dim MyName As String
            Dim MyExtension As String

            MyName = fso.GetFileName(CStr(str))
            MyExtension = fso.GetExtensionName(MyName)

            System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)

            CheckedListBox1.Items.Add(str, CheckState.Checked)
            Thumbcontrol1.AddThumbnail(str)
            Thumbcontrol1.BackgroundImage = Nothing
            CheckedListBox1.SelectedIndex = 0
            ProgressBar2.PerformStep()
        Next
        SaveProject.Enabled = True
        Delete.Enabled = True
        Edit.Enabled = True
        ClearAll.Enabled = True
        CheckAll.Enabled = True
        UncheckAll.Enabled = True
        Timer1.Stop()
        Load.Text = "Loading Completed"
    Else
    End If
    ProgressBar2.Visible = False
    Load.Text = Nothing

End Sub

Ответы [ 3 ]

0 голосов
/ 07 августа 2011

Индикатор выполнения перестает двигаться, потому что Windows считает, что с вашей программой что-то серьезно не так.Он заменяет ваше главное окно на «призрачное» окно, которое вы можете сказать, потому что в строке заголовка написано «Не отвечает».

Это сделано для того, чтобы предупредить пользователя о том, что ваша программа мертва для мира ине будет отвечать на любые входные данные от пользователя.Нажатие мыши или стук по клавиатуре не окажет никакого эффекта, все, что может сделать пользователь, это беспомощно наблюдать, пока ваш код проходит через движения.

Это не создает желаемого пользовательского интерфейса.Вы решаете это с помощью BackgroundWorker, поэтому тяжелая работа выполняется в отдельном потоке.Оставляя поток пользовательского интерфейса отзывчивым.Обязательно прочтите статью MSDN, чтобы знать, что делать, и вам придется адаптировать свой код.

0 голосов
/ 07 августа 2011

Удалите ProgressBar2.Step = 10 строку и сделайте это:

        Dim str As String
        Dim counter As Integer 'new!
        For Each str In OpenFileDialog1.FileNames
            Load.Text = "Loading..."

            Dim fso As New FileSystemObject
            Dim MyName As String
            Dim MyExtension As String

            MyName = fso.GetFileName(CStr(str))
            MyExtension = fso.GetExtensionName(MyName)

            System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)

            CheckedListBox1.Items.Add(str, CheckState.Checked)
            Thumbcontrol1.AddThumbnail(str)
            Thumbcontrol1.BackgroundImage = Nothing
            counter += 1 'new
            CheckedListBox1.SelectedIndex = 0
            ProgressBar2.Value = (counter * 100) / OpenFileDialog1.FileNames.Length 'new
        Next

Это не решает проблему того, что вы не используете многопоточность, так как другие ответы верны, чтобы указать.

0 голосов
/ 07 августа 2011

Не используйте пользовательский интерфейс для загрузки. Используйте Фоновый рабочий. BackgroundWorker работает в другом потоке и может сообщать о ходе выполнения, чтобы связать его с индикатором выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...