Member 11856456 Ответов: 2

Как я могу использовать прогресс, чтобы показать прогресс записей, вставляемых в таблицу


На данный момент я сделал messagebox из формы, которая дает мне возможность вводить новые записи в мою таблицу из листа excel или конвертировать ее в совершенно новую таблицу.

вот этот код:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
       ProgressBar1.Maximum = Form1.totalrecords
       ProgressBar1.Increment(1)

       If ProgressBar1.Value = ProgressBar1.Maximum Then
           Timer1.Stop()
       End If
   End Sub


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Form1.import_new_table()
       Form1.divide_temp_table_into_other_tables()

       Timer1.Start()
   End Sub


то
Form1.totalrecords
он основан на общем количестве строк на листе excel, который копируется в базу данных.

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

Есть предложения?

Что я уже пробовал:

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

[ПРАВКА ПОСЛЕ РЕШЕНИЯ 1]
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   BackgroundWorker1.RunWorkerAsync()
   Form1.import_new_table()
   Form1.divide_temp_table_into_other_tables()

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
   For x As Integer = 0 To 100
      System.Threading.Thread.Sleep(100)
      BackgroundWorker1.ReportProgress(CInt(x / Form1.totalrecords) * 100)
   Next
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
   ProgressBar1.Value = e.ProgressPercentage
   '  If ProgressBar1.Value = ProgressBar1.Maximum Then

   ' End If
End Sub

Private Sub Import_excel_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   ProgressBar1.Maximum = Form1.totalrecords
End Sub


однако индикатор выполнения не двигается, и теперь память намного больше-она была около 152 МБ и теперь стреляет до 9 - 10 Гб.

2 Ответов

Рейтинг:
14

Richard MacCutchan

Для импорта записей необходимо использовать фоновый рабочий поток. Запуск импорта в потоке графического интерфейса предотвращает обновление экрана системой. Множество статей, перечисленных на сайте codeproject: background worker - поиск в Google[^] которые объясняют проблему и ее решение.


Member 11856456

содержание перенесено на вопрос в [EDIT After solution 1]

Nelek

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

Рейтинг:
0

Eng Ahmed Taha

private Maximum_rec as integer

Sub Importdata 
     ' you have to count records before importing
     Maximum_rec = Form1.totalrecords
     Form1.import_new_table()
     Form1.divide_temp_table_into_other_tables()
End Sub 

Sub Importdata_withprogress

       Dim nth As New Threading.Thread(AddressOf Importdata )
       nth.Start()
       While nth.IsAlive

            IF Maximum_rec <> 0 THEN

                ProgressBar1.Maximum = Maximum_rec
                'x=the current record in loop
                IF x <= Maximum_rec Then
                    ProgressBar1.Value = x
                END IF

            END IF

            Application.DoEvents
            'Threading.Thread.Sleep(100)

       End While

End Sub