none
Tempo ao Iniciar Aplicação RRS feed

  • Pergunta

  • Pessoal,

     

      Usando  o LINQ to SQL,  ao inicializar minha aplicação pela primeira vez  até que seja feito todo o tramite interno ( Instanciar dataContext, linkar com Banco de  dados, etc.) toma um tempo considerável   quase  30 segundos, isso  para o usuário é uma eternidade....  Alguém já bolou algum  modo inteligente de distrair  a atenção do usuário durante este  tempo?  Uma Progressbar  ou  uma SplashScreen,  com  thread rodando em paraleo  de modo que  o usuário  possa ver que algo  esta sendo inicializado e não ficar tão ansioso  com os segundo perdidos  na inicialização.

     

      Se alguém puder ajudar com dicas  e sugestões agradeço, tentei fazer  algumas coisas sozinho mas o resultado não foi satisfatório.

     

    Grato,

     

    Edmilson

     

    segunda-feira, 3 de novembro de 2008 20:10

Respostas

  • Para completar ...

     

    “..Mas  é carregar  na memória  os  datasources  que estou usando com o LINQ para preencher as Combos  e Grids, como faço isso, sem gerar  erros?...”

     

    Executas a rotina de carregamento dos Grids, preencher as Combos, etc, depois do processo chegar ao fim e não no início, no exemplo, “DepoisFim_do_InicioWork”.

     

     Se o processo ficar demorado e não muito “credível”, sempre podes utilizar uma progressbar "ProgressBarStyle.Marquee", mas tens de alterar o código.

     

     Agora é só adaptares ao teu caso.

     

    Abraços

     

    quinta-feira, 6 de novembro de 2008 22:33

Todas as Respostas

  • segunda-feira, 3 de novembro de 2008 20:23
  • Renato,  acho que não fui muito especifico....Minha aplicação é Windows Forms, e esta tópico não refrescou minhas ideias

     

    Ed

    terça-feira, 4 de novembro de 2008 00:08
  • Opa Edmilson, me desculpe, realmente o post que mandei é para webform, no caso de windows form você deve usar o progress mesmo, mas aí não tenho muita experiência para te ajudar, faz tempo que não trabalho com windows form.

     

    Boa sorte,

     

    []s

     

    Renato

     

    terça-feira, 4 de novembro de 2008 01:13
  •  

    Ola Edmilson

     

    vc pode utilizar a propria progress bar que tem na tool box do Visual Studio

    ou pode colocar algum gif de progresso

    que pode encontrar com faciilidad no google

     

    ai coloca o gif rolando enquanto carrega o que deseja

     

    abraços

     

    e caso tenha sido util, favor marcar

    terça-feira, 4 de novembro de 2008 18:34
  • Edmilson Silva,

     

    Sugestão : Utiliza o componente Backgroundworker, para todas as ações que demorem algum tempo.

     

     Este exemplo utiliza uma progressbar, um label de status, um label com a percentagem do progresso, etc., mais do que suficiente para “distrair” o utilizador.

     

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=3858351&SiteID=21

     

     

    Abraços

     

    terça-feira, 4 de novembro de 2008 18:54
  • Jorge, boa noite!

     

      A idéia que tenho e bem próxima dos exemplos  que tem no post,  inicializar  a aplicação  e em paralelo ir inicializado o DataContext, preenchendo  alguns Grids, de forma que quando o usuário  for  usar alguma coisa o sistema simplesmente “mostre”  mas na verdade tudo já estará carregado na memória do PC,   isso é o que esta sendo difícil de fazer, os exemplos mostram  como simular uma operação demorada de um loop com o progressbar  mostrando a porcentagem de conclusão do loop.  Mas  é carregar  na memória  os  datasources  que estou usando com o LINQ para preencher as Combos  e Grids, como faço isso, sem gerar  erros?

     

      Qualquer ajuda é bem vinda.

     

    Grato,

     

    Ed

     

    quinta-feira, 6 de novembro de 2008 20:30
  • Edmilson,

     

     É exatamente isso, quando o progressbar começa a fazer o progresso, já a rotina de carregamento dos grids foi executada.

     

     Fiz este código há pouco tempo, tem algumas diferenças do outro post, e só depois da progressbar chegar ao fim é que executo a rotina, mas resulta perfeitamente.

     

    Tenho um form onde existe uma progressbar, um label status, um label com a percentagem do progresso, um botão cancelar, e um botão “trabalhar em background”.

     

    Quando o utlizador clica num determinado botão, para, por exemplo carregar grids, antes de executar a rotina, faço este form aparecer e logo no evento load do form faço : Me.lblStatus_Status.Text = "A inicar processo..."

     

    Depois executo o Call ArranqueWorker() e...

     

    Private Sub ArranqueWorker()

            Try

                Me.lblStatus_Status.Text = "A processar..."

                Me.btnCancelar_Status.Enabled = True

                Worker = New System.ComponentModel.BackgroundWorker

                Worker.WorkerReportsProgress = True

                Worker.WorkerSupportsCancellation = True

                Worker.RunWorkerAsync()

                AddHandler Worker.DoWork, New DoWorkEventHandler(AddressOf InicioWork)

                AddHandler Worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf DepoisFim_do_InicioWork)

                AddHandler Worker.ProgressChanged, New ProgressChangedEventHandler(AddressOf ProgressoWork)

          

     Catch ex As Exception

    MsgBox(ex.Message.ToString)

            End Try

        End Sub

    _____________________________________________________________________________

    Private Sub InicioWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)

            'Aqui a progressbar faz o seu progresso

            For i = 1 To 100

                Worker.ReportProgress(i, i & " %")

                System.Threading.Thread.Sleep(20) 'Aqui controlas a velocidade do progressbar

            Next

             Try

                If Worker.CancellationPending Then

                    e.Cancel = True

                End If

           

    Catch ex As Exception

    MsgBox(ex.Message.ToString)

            End Try

     

        End Sub

    _____________________________________________________________________________

     

    Private Sub DepoisFim_do_InicioWork(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)

            'É aqui que executo a ação que desejo, no meu caso, faço executar a rotina "Processar_Enchimentos" num form mdi

     

                        DirectCast(My.Forms.Menu.ActiveMdiChild, FormArmazemSul).Processar_Enchimentos()

     

            Catch ex As Exception

                          MsgBox(ex.Message.ToString)

            End Try

     

            Try

                If e.Cancelled Then

                    Me.lblStatus_Status.Text = "Processo cancelado."

                    Me.btnCancelar_Status.Enabled = False

                Else

                    Me.lblStatus_Status.Text = "Processo concluído."

               End If

                    Me.btnCancelar_Status.Enabled = True

                                    

            Catch ex As Exception

                MsgBox(ex.Message.ToString)

     

            End Try

     

        End Sub

     _____________________________________________________________________________

     

    Private Sub ProgressoWork(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)

            Me.ProgressBar_Status.Value = e.ProgressPercentage

            Me.lblPercentagem_Status.Text = TryCast(e.UserState, String)

        End Sub

    _____________________________________________________________________________

     

    O botão cancelar não pára o progresso da progressbar, apenas não executa a rotina Processar_Enchimentos

     

    Private Sub btnCancelar_Status_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar_Status.Click

            Me.btnCancelar_Status.Enabled = False

                    If Me.Worker.IsBusy Then

                        Me.Worker.CancelAsync()

                    End If

        End Sub

     

    Porquê não executar a rotina antes do progressbar estar concluido ? Foi a maneira que arranjei para evitar “cross threading”, pois neste caso a rotina processar_enchimentos faz disparar outras threads.

     

    No meu caso, todo este processo é executado muito rapidamente, o que me levou a utilizar um Timer, mas não mostrei para não complicar ainda mais este código.

     

    O código do botão “trabalhar em background”, é simplesmente : Me.WindowState = FormWindowState.Minimized

     

    Espero ter ajudado

     

    Abraços

     

    quinta-feira, 6 de novembro de 2008 22:25
  • Para completar ...

     

    “..Mas  é carregar  na memória  os  datasources  que estou usando com o LINQ para preencher as Combos  e Grids, como faço isso, sem gerar  erros?...”

     

    Executas a rotina de carregamento dos Grids, preencher as Combos, etc, depois do processo chegar ao fim e não no início, no exemplo, “DepoisFim_do_InicioWork”.

     

     Se o processo ficar demorado e não muito “credível”, sempre podes utilizar uma progressbar "ProgressBarStyle.Marquee", mas tens de alterar o código.

     

     Agora é só adaptares ao teu caso.

     

    Abraços

     

    quinta-feira, 6 de novembro de 2008 22:33
  • Jorge, valeu mesmo, ajudou bastante a clarear minha ideia.

     

    grato,

     

    Ed

    segunda-feira, 10 de novembro de 2008 23:56