Fórum Quero colocar uma Barra de Progresso na hora que tiver Sincronizando os Banco de Dados com o Sync Framework. #10067

13/10/2009

0

  Tenho um Sistema que faz Sincronismo entre 2 Bancos. Tenho um Banco Local SQL Compact 3.5 SP1 e um Banco WEB SQL Server 2005, que funciona assim. Eu digito no Sistema e as informações vão para o Banco Local, quando eu mando Sincronizar ele vai para o Banco WEB. Ai se eu tiver fora de casa eu mando Sincronizar o programa e todas as informações são atualizadas no Banco. Isso funciona perfeitamente, eu uso esse artigo para fazer o sistema  http://www.linhadecodigo.com.br/Artigo.aspx?id=2241  Mas agora vai o meu problema, o Sistema demora alguns segundos para Sincronizar os 2 Bancos e o cliente não sabe se o Sistema está Sincronizando ou travado até que ele termine. Ai quero colocar um ProgressBar, pode ser na Propriedade "marquee" só para a barra ficar se mechendo e quando terminar enche a Barra, mas o pior é quando eu clico no Botão para Sincronizar ele trava a Barra e ela tambem fica parada até terminar o Sincronismo.   Se quiser eu mando o meu Projeto, ele está sendo feito pelo VS2010. Mas se quiser eu faço um exemplo no VS2008, mas ele é exatamente igual ao Artigo.
Rodolfo Camargo

Rodolfo Camargo

Responder

Posts

15/10/2009

Luiz Maia

Ola Rodolfo, por favor me mande seu projeto para que eu possa dar uma avaliada no que esta ocorrendo. Sendo que o uso do ProgressBar com o Marquee é bem simples, pode ser outro tipo de problema, não tem como dar errado.   Enquanto isto, caso seu projeto ja esteja em Produção, pode utilizar o comando try/catch e dar uma Mensagem (MessageBox) para o cliente assim que terminar ou dar alguma excessão na execução.   Aguardo o projeto, ok?   Abraços Att Luiz Maia
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

 Estou conseguindo resolver o meu problema, mas está dando um erro. Uso esse código para fazer o Sincronismo:

// Cria SyncAgent
            BancoLocalSyncAgent syncAgent = new BancoLocalSyncAgent();

            // Chama método Synchronize de forma assíncrona
            // usando anonymous delegates
            Func<Microsoft.Synchronization.Data.SyncStatistics> async = new Func<Microsoft.Synchronization.Data.SyncStatistics>(syncAgent.Synchronize);
            async.BeginInvoke((r) =>
            {

                // Aqui o método Synchronize terminou...
                Microsoft.Synchronization.Data.SyncStatistics syncStats = async.EndInvoke(r);

                // Modifica o estilo do progress bar para indicar que o processamento foi finalizado
                progressBar1.Style = ProgressBarStyle.Blocks;
                progressBar1.MarqueeAnimationSpeed = 0;
                progressBar1.Value = 0;

            }, null);

            // Na linha abaixo o método Synchrronize ainda está executando
            // Modifica o estilo do progress bar para indicar que existe um processamento
            progressBar1.Style = ProgressBarStyle.Marquee;
            progressBar1.MarqueeAnimationSpeed = 100;
            progressBar1.Value = 100;

 Mas está dando um problema nessa Linha progressBar1.Style = ProgressBarStyle.Blocks; o problema que aparece é:  Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on.
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

 Nesse código estou usando uma ProgressBar como Marquee, mas se puder fazer o Sincronismo e controlar como uma ProgressBar Block ou Continuous é melhor, porque ai verei em Tempo Real o quanto falta.
Responder

Gostei + 0

15/10/2009

Luiz Maia

Oi Rodolfo, blz?   Para controlar o pb vc precisa saber a quantidade de loops que vai ter para incrementar no seu step. Fiz este modelinho para dar uma olhada, so compilar e rodar, ok?   http://video.devmedia.com.br/discovirtual/200237/Rodolfo%20-%20progressBar.zip   Aguardo seu retorno.   Abraços Att Luiz Maia
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

Isso tudo bem, mas o problema é esse erro que está dando quando tento mudar a Propriedade da Barra e Preenche-la. Vou enviar o Código completo, a unica coisa é que fiz no Visual Studio 2010. Se quiser eu Zipo o Código Fonte e te mando.
Responder

Gostei + 0

15/10/2009

Luiz Maia

Por favor me mande o codigo zipado então. Mas vc deu uma olhada no que te mandei? Tentou usar desta forma? Funcionou?   Aguardo Att Luiz Maia
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

Esse é o Link com todo o Projeto  http://www.fileurls.com/download.ashx?id=fjrjld  ele foi desenvolvido pelo Visual Studio 2010.
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

 Ou se quiser vou passando o problema que vai aparecendo.
Responder

Gostei + 0

15/10/2009

Rodolfo Camargo

 Ou se quiser vou passando o problema que vai aparecendo.
Responder

Gostei + 0

15/10/2009

Luiz Maia

Rodolfo,   Para resolver o problema da Thread simultanea, faça o seguinte:     using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Reflection; namespace TesteProgressBar { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { progressBar1.Minimum = 0; progressBar1.Maximum = 100; System.Threading.Thread t1 = new System.Threading.Thread(startProgress); t1.Start(); } void startProgress() { for (int i = 0; i < 10; i++) { SetControlPropertyValue(progressBar1, "value", i); System.Threading.Thread.Sleep(100); } } delegate void SetControlValueCallback(Control oControl, string propName, object propValue); private void SetControlPropertyValue(Control oControl, string propName, object propValue) { if (oControl.InvokeRequired) { SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue); oControl.Invoke(d, new object[] { oControl, propName, propValue }); } else { Type t = oControl.GetType(); PropertyInfo[] props = t.GetProperties(); foreach (PropertyInfo p in props) { if (p.Name.ToUpper() == propName.ToUpper()) { p.SetValue(oControl, propValue, null); } } } } } }   Veja que criei um método SetControlPropertyValue. Ele resolve este problema, basta invoca-lo na chamada do progress bar onde ocorre o erro de thread, ok?   Veja no exemplo acima.   Aguardo   Att Luiz Maia
Responder

Gostei + 0

16/10/2009

Rodolfo Camargo

Resolveu sim o meu problema, agora estou conseguindo colocar a Barra que eu quero no Sincronismo. Muito Obrigado.
Responder

Gostei + 0

16/10/2009

Luiz Maia

Legal Rodolfo,   Precisando, é so falar! Estamos a disposição para qualque tipo de dúvidas.   Abraços Att Luiz Maia
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar