Furqan Sehgal Ответов: 3

Отображение анимированного gif-файла во время выполнения кода


Привет,
У меня есть код, выполнение которого занимает довольно много времени. Этот код начинает выполняться, когда я нажимаю кнопку на своей форме.
Я хочу отобразить анимированный gif-файл, показывающий, что система работает. Когда приложение запускается, gif продолжает показывать прогресс, но когда я нажимаю кнопку 1, код начинает выполняться, анимация останавливается, а затем после завершения выполнения анимация начинается снова.

Как заставить анимацию работать во время выполнения кода.

Код таков:

Dim sqldatasourceenumerator1 As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
        Dim datatable1 As DataTable = sqldatasourceenumerator1.GetDataSources()

        DataGridView1.DataSource = datatable1

Thanks

3 Ответов

Рейтинг:
22

Valery Possoz

Привет,

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

Я рекомендую вам взглянуть на класс backgroundworker - это очень простой способ управления потоками.
http://msdn.microsoft.com/en-us/library/4852et58.aspx[^]

Приведенный ниже код также использует делегат для обновления потока пользовательского интерфейса.
Вот статья, объясняющая, как вам это сделать:
Руководство для начинающих делегатов[^]

И применительно к вашей проблеме это выглядит так:

Dim bw As BackgroundWorker = New BackgroundWorker
Public Delegate Sub PictureVisibilityDelegate(ByVal visibility As Boolean)
Dim ChangePictureVisibility As PictureVisibilityDelegate

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddHandler bw.DoWork, AddressOf bw_DoWork
    AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted
    ChangePictureVisibility = AddressOf ChangeVisibility
End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Not bw.IsBusy = True Then
            bw.RunWorkerAsync()
        End If
    End Sub


Public Sub ChangeVisibility(ByVal visibility As Boolean)
    PictureBox1.Visible = visibility
End Sub

Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.Invoke(ChangePictureVisibility, True)
    Dim sqldatasourceenumerator1 As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
    Dim datatable1 As DataTable = sqldatasourceenumerator1.GetDataSources()
    DataGridView1.DataSource = datatable1
End Sub

Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    Me.Invoke(ChangePictureVisibility, False)
End Sub





Валери.


Рейтинг:
2

Mike Meinz

Возможно, сетевая активность держит поток занятым (например, удерживая блокировку), поэтому анимированный GIF не получает никакого времени для запуска. Если это является причиной, то вам, возможно, придется создать новую форму для хранения PictureBox с анимированным GIF и создать экземпляр, а затем показать эту форму в виде немодального окна, как показано ниже.

----Перед вашим кодом-----

Dim GifForm as New AnimatedGifForm
GifForm.Show

----Ваш код----
Dim sqldatasourceenumerator1 As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
Dim datatable1 As DataTable = sqldatasourceenumerator1.GetDataSources()
DataGridView1.DataSource = datatable1

----После вашего кода-----
GifForm.Close


Таким образом, анимированный Gif работает в отдельном потоке.


Рейтинг:
1

Mike Meinz

Окна форма решения

1. Добавить изображение поле для ваших окон форма.
2. центрируйте графическое поле на форме Windows.
3. Поместите свой анимированный GIF в графическое поле. Используйте свойство InitialImage в окне свойств для импорта анимированного GIF-файла.

В форме загрузить обработчик событий,
класть:

pbSearching.Visible = False
pbSearching.Enabled = True
Me.BringToFront()


Когда все будет готово, сделайте анимированный GIF видимым:
pbSearching.Visible = True
pbSearching.BringToFront()


Когда закончите с активностью, сделайте анимированный GIF невидимым:
pbSearching.Visible = False
Me.BringToFront()


Пример использования вашего кода:
pbSearching.Visible = True
pbSearching.BringToFront()
Dim sqldatasourceenumerator1 As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
Dim datatable1 As DataTable = sqldatasourceenumerator1.GetDataSources()
DataGridView1.DataSource = datatable1
pbSearching.Visible = False
Me.BringToFront()


Вы можете найти несколько анимированных GIF-файлов на AnimatedGIF.net


Furqan Sehgal

Спасибо! но окно с картинкой видно только тогда, когда процесс закончился. Он не отображается во время выполнения процесса.

Mike Meinz

Сделайте его видимым и принесите вперед, прежде чем начать действие. Я использую этот код, и он отлично работает. Если у вас все еще есть проблемы, опубликуйте свой код.

Mike Meinz

Я пересмотрел свое решение. Пожалуйста, ознакомьтесь.

Mike Meinz

Документация для GetDataSources (http://msdn.microsoft.com/EN-US/library/vstudio/system.data.sql.sqldatasourceenumerator.getdatasources(v=vs. 100).aspx) указывает, что GetDataSources выполняет поиск SQL-серверов в сети. Возможно, сетевая активность держит поток занятым (например, удерживая блокировку), поэтому анимированный GIF не выделяется никакого времени для запуска.

sampath1750

Привет, я добавил тот же код в кнопку click, но поле изображения видно после завершения процесса нажатия кнопки.

Спасибо