none
Sincronização de um processo com um progressBar RRS feed

  • Pergunta

  • Amigos desenvolvedores, tenho a seguinte situação:

     

    Preciso sincronizar uma barra de progresso com um processo. Exemplo: ao clicar em um botão chamo um método que possui uma query que faz um SELECT no banco MSSQLSERVER e carrega um DataGridView. Devido à tabela possuir milhares de registros este processo demora um pouco. Por isso gostaria de mostrar uma barra de progresso mostrando o andamento do processo, para que o usuário não pense que o sistema travou. Desde já agradeço a todos.

    segunda-feira, 20 de junho de 2011 11:38

Respostas

  • O problema maior é que a lentidão fica na carga do dataset... a menos que vc faça uma consulta com count para saber o numero de registros que vão ser retornados... fica difícil saber qual a quantidade total de registro antes da carga...

    Se não for problema vc term um progress bar que vá sendo carregado varias veses... voce pode tentar algo desse jeito:

    progressBar.Maximum = 100;
    progressBar.Value = 0;
    using (var conn = new SqlConnection()) {
      var command = new SqlCommand();
      command.CommandText = "SELECT ...";
      var adapter = new SqlDataAdapter(command);
      adapter.RowUpdating += (sender, e) => {
        if (progressBar.Value == progressBar.Maximum) progressBar.Value = 0;
        progressBar.Increment(1);
      };
    }
    


    quarta-feira, 22 de junho de 2011 20:08
    Moderador
  • Vinícius,

    Que eu saiba, o Fill do DataAdapter (que provavelmente o seu método SelecionaCliente está utilizando) não retorna o progresso atual... Portanto, o jeito seria fazer como o Rui indicou, criando uma ProgressBar que fica sendo preenchida várias vezes enquanto o método não finaliza a execução... Você tentou fazer como o Rui sugeriu?

    Outra opção, também como o Rui sugeriu, é se você tiver a quantidade de linhas que serão retornadas (fazendo um count antes, por exemplo), você conseguiria fazer uma ProgressBar com o progresso real da carga utilizando o evento RowChanged da DataTable... Veja um exemplo disso no seguinte link:

    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/88bf31ed-6e8d-4543-9201-244285f9b6a9


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 4 de julho de 2011 19:09
    Moderador

Todas as Respostas

  • Vinicius, veja se o link abaixo pode ajudar.

    http://wiki.portugal-a-programar.org/dev_net:vb.net:progressbar_datagrid

     


    Abraço

    Estevam
    Siga luizestevamb on Twitter

    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    segunda-feira, 20 de junho de 2011 13:44
  • Interessante o que esse post fala, mas ainda não é o que eu gostaria de fazer. Na verdade, pelo o que eu entendi neste post, ele está incrementando o progressBar conforme vai lendo uma linha da tabela, que foi carregada no dataset. O que estou tentando fazer é um sincronismo entre um método e um progressBar.
    segunda-feira, 20 de junho de 2011 16:02
  • Vinicius,

     

    Tente este codigo e coloque no evento do seu datagridwier:

     

                progressBar1.Minimum = 0;
                progressBar1.Maximum = 5;
                progressBar1.Step = 1;
            
                for (int i = 0; i <= 4; i++)
                    progressBar1.PerformStep();

     

    Att

    Luiz

    segunda-feira, 20 de junho de 2011 20:53
  • Vinicius,

    Você poderia criar um evento que seria disparado de tempos em tempos a partir do método que faz a sua query. Então, no método que faz o tratamento do evento você atualiza a sua progressBar.

    terça-feira, 21 de junho de 2011 13:06
  • Vinícius,

    Tudo depende de como você está fazendo a carga do seu DataGridView... Você poderia nos passar maiores detalhes?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 22 de junho de 2011 19:04
    Moderador
  • O problema maior é que a lentidão fica na carga do dataset... a menos que vc faça uma consulta com count para saber o numero de registros que vão ser retornados... fica difícil saber qual a quantidade total de registro antes da carga...

    Se não for problema vc term um progress bar que vá sendo carregado varias veses... voce pode tentar algo desse jeito:

    progressBar.Maximum = 100;
    progressBar.Value = 0;
    using (var conn = new SqlConnection()) {
      var command = new SqlCommand();
      command.CommandText = "SELECT ...";
      var adapter = new SqlDataAdapter(command);
      adapter.RowUpdating += (sender, e) => {
        if (progressBar.Value == progressBar.Maximum) progressBar.Value = 0;
        progressBar.Increment(1);
      };
    }
    


    quarta-feira, 22 de junho de 2011 20:08
    Moderador
  • ...
    
    this.dsClientes = repCli.SelecionaCliente();
    this.bsClientes.DataSource = this.dsClientes;
    this.bsClientes.DataMember = this.dsClientes.Tables[0].TableName;
    this.gridClientes.DataSource = this.bsClientes;
    FormataGrid();
    
    ...
    


    dsClientes é o meu DataSet. O método FormataGrid() edita as colunas e modifica a cor de alguns registros especificos.

    Quando a tabela chegar em torno de 1.000.000.000 de registros, a consulta irá demorar um pouco. Por isso eu coloquei uma barra de progresso para ficar carregando enquanto processa a query do método SelecionaCliente(). O sincronismo seria este.

     

    Desde já agradeço pela colaboração de tosdos.

    terça-feira, 28 de junho de 2011 19:57
  • Vinícius,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 4 de julho de 2011 18:34
    Moderador
  • Ainda não consegui. Pesquisei em vários artigos, mas não encontrei nada.
    segunda-feira, 4 de julho de 2011 18:51
  • Vinícius,

    Que eu saiba, o Fill do DataAdapter (que provavelmente o seu método SelecionaCliente está utilizando) não retorna o progresso atual... Portanto, o jeito seria fazer como o Rui indicou, criando uma ProgressBar que fica sendo preenchida várias vezes enquanto o método não finaliza a execução... Você tentou fazer como o Rui sugeriu?

    Outra opção, também como o Rui sugeriu, é se você tiver a quantidade de linhas que serão retornadas (fazendo um count antes, por exemplo), você conseguiria fazer uma ProgressBar com o progresso real da carga utilizando o evento RowChanged da DataTable... Veja um exemplo disso no seguinte link:

    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/88bf31ed-6e8d-4543-9201-244285f9b6a9


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 4 de julho de 2011 19:09
    Moderador