Usuário com melhor resposta
Tempo ao Iniciar Aplicação

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
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
Todas as Respostas
-
Edmilson, veja se isto te ajuda:
http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=4044128&SiteID=21
[]s
-
-
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
-
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
-
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
-
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
-
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
-
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
-